يتم تقديم مواقع أخبار BBC World Service باستخدام تطبيق Simorgh ، وهو تطبيق يعتمد على ReactJS. يقدم Simorgh أيضًا صفحات مقالات AMP News للخدمة العالمية وأخبار الخدمة العامة وبي بي سي سبورت.
يوفر Simorgh تجربة ويب سريعة ويمكن الوصول إليها باستخدام ملايين الأشخاص حول العالم كل شهر (انظر قائمة مواقع الويب التي تستخدم Simorgh). يتم الحفاظ عليها بانتظام وتوثيق جيد ، ونرحب بالمساهمين مفتوح المصدر.
يتم الحفاظ على Simorgh بشكل أساسي من قبل فرق هندسة الويب BBC News. إنه يقدم أخبارًا موثوقة للغاية للقراء في جميع أنحاء العالم ، حاليًا (41 لغة). نحن ندعم مجموعة واسعة من الأجهزة ونهتم بعمق في الحجم والأداء وإمكانية الوصول. نحن نعمل في فرق مرنة ومرنة ، ولدينا خريطة طريق مثيرة للتنمية المستقبلية.
يرجى التعرف على: لدينا:
NB هناك المزيد من الوثائق مع الكود ذي الصلة. القائمة أعلاه هي فهرس الوثائق العليا لإعادة الريبو لدينا.
يتم نقل طلب إلى مقال BBC (https://www.bbc.co.uk/news/articles/clldg965yzjo) إلى تطبيق Simorgh من خدمة التوجيه والخزاتاز المحتملة (تسمى Mozart).
يطابق الطلب مسارًا في خادمنا Express باستخدام مطابقة Regex ( articleRegexPath || frontPageRegexPath ). إذا كان عنوان URL يتطابق مع نمط regex المحدد مسبقًا لمقال أو الصفحة الأولى ، فإننا نجلب بعض المعاملات من المسار باستخدام وظيفة getRouteProps . هذا يعيد الخدمة ، isamp ، المسار والمطابقة خصائص. المسار هو مسار رد فعل React يحدد طريقة لجلب JSON الأولي المستخدمة لتقديم الصفحة وحاوية React التي تجعل IE ArticleContainer ، وهذا يسمى عادة getInitialData
بمجرد إرجاع البيانات ، نسحب رمز الحالة ونمرر كل هذه البيانات كدعائم إلى مستندنا الرئيسي باستخدام renderDocument .
يمرر المستند عنوان URL و JSON Data و BBC Origin و ISAMP والخدمة إلى حاوية التطبيق الرئيسية ويتم تقديم النتيجة إلى سلسلة باستخدام طريقة renderToString الخاصة بالتفاعل. ثم يتم تمرير هذه السلسلة إلى DocumentComponent باعتبارها التطبيق الرئيسي مع صفيف الأصول ، وعلامات النمط (الإخراج من المكونات المصممة) وأي نصوص/روابط تحتاج إلى إضافتها إلى الرأس. ثم يتم تقديم هذا إلى علامات HTML ثابتة باستخدام رد الفعل الخاصة بـ renderToStaticMarkup وإرسالها إلى المستخدم كـ HTML ثابت. يتم تضمين هذه الاستجابة في حزم JS الخاصة بنا والتي سيقوم جهاز المستخدمين بتنزيلها لتوصيل تطبيق الصفحة الفردية (SPA) للرحلات اللاحقة.
الآن بعد أن تم تنزيل HTML الخام ، يقوم ملف JS من جانب العميل بتشغيل الاستجابة الأولية مع التطبيق الأولي مع التطبيق الجانبي للعميل. خلال هذه العملية ، يستخدم React حمولة JSON الأولية (متوفرة على كائن النافذة العالمية SIMORGH_DATA ) لترطيب الترميز الأصلي الذي تم إرجاعه بواسطة ReactDomServer. يتوقع React أن يكون المحتوى المقدم متطابقًا بين الخادم والعميل (هذا هو السبب في أننا نرسل حمولة JSON الأولية مع صفحة SSR ، وبالتالي فإن مرحلة الترطيب تعمل بنفس البيانات التي يقدمها الخادم).
يتكون حمولة JSON لمقال من عدد من الكتل. كل كتلة هي كائن يمثل عنصرًا على الصفحة ، وقد يكون هذا عنوانًا وصورة وفقرة وما إلى ذلك. كل من هذه الكتل لها نوع كتلة وسيطابق نوع الكتلة مع حاوية محددة في Simorgh على سبيل المثال ، ستطابق الصورة مع حاوية الصورة.
سوف تتكرر حاوية Articlemain عبر كل كتلة JSON ، وتطابقها مع حاوية React المقابلة لها وتمرير البيانات عبر الدعائم. هذه الحاويات هي المكان الذي يجلس فيه منطق تقديم كل نوع كتلة. في هذه المرحلة حيث نستخدم مكونات الواجهة الأمامية المثبتة من مكتبة مكون psammead. على سبيل المثال ، ستعمل حاوية الصورة على استيراد حاوية الشكل ، وسيقوم الشكل باستيراد واستخدام صورة psammead ومكونات Psammead-Image-Placeholder. سيكون لدى الصورة الموجودة على مقال عمومًا تعليقًا توضيحيًا ، وبالتالي فإن حاوية الرقم ستحصل على حاوية التسمية التوضيحية التي قد تتضمن المزيد من مكونات الواجهة الأمامية من psammead لتقديم تعليق على الصورة.
يتم تكرار هذه العملية لكل كتلة داخل مقال ، مما يجعل في النهاية الهيئة الرئيسية لمقال إخباري باستخدام مجموعة من حاويات React لمنطق العمل ومكونات React لتوصيف الواجهة الأمامية.
يتم تمرير كل عرض من خلال مجموعة من مكونات المخصص (مكونات الترتيب الأعلى) لتعزيز الصفحة ، هذه المخصصات ؛
مع مجموعة مختارة من أنواع الصفحات التي يتم تمريرها عبر withoptimizelyprovider ، فإن ذلك يتيح استخدام الأمثل في أنواع الصفحات المحددة.
يضمن المخصص المتغير أن الخدمات التي تحتوي على متغيرات (مثل simp ، lat ) تعيد توجيهًا دائمًا إلى عنوان URL الذي يجعل المتغير المناسب.
إذا كان المستخدم ينتقل إلى عنوان URL دون توفير المتغير ، وتم تعيين المتغير في ملف تعريف الارتباط ، يتم تقديم صفحة Cookie Variant. خلاف ذلك ، يتم تقديم الصفحة المتغيرة الافتراضية
إذا انتقل المستخدم إلى عنوان URL مع متغير ، وتم تعيين متغير في ملف تعريف الارتباط ، يتم تقديم صفحة Cookie Variant. خلاف ذلك ، يتم تقديم الصفحة المتغيرة المطلوبة.
WithContexts Hoc عبارة عن غلاف يوفر الوصول إلى مزودي السياق المختلفين المتاحين في التطبيق. يمكن لأي مكون طفل داخل مزودي السياق الوصول إلى بيانات السياق عبر خطاف Usecontexts.
يلف غلاف الصفحة المخصص ببساطة المقالة أو حاويات الصفحات الأمامية مع تخطيط ، في الوقت الحالي ليس لدينا سوى تخطيط صفحة واحدة. يتضمن هذا التصميم رأسًا وتذييلًا ومقدمي خدمات السياق الذي يقدم الجسم الرئيسي كطفل بين الرأس وتذييل التذييل.
يقوم الخطأ المخصص بالتحقق من خطأ الخطأ الذي تم تمريره ، إذا تم تعيين خطأ لبطولة المقالة أو حاوية الصفحات الأمامية يتم إرجاعها ببساطة.
إذا تم تعيين الخطأ على TRUE ، يتم إرجاع مكون الخطأ ، مما يمنح المستخدم مؤشراً مرئيًا للخطأ على سبيل المثال صفحة خطأ 500.
على افتراض أن المخصص الآخر قد أعاد المقالة الأصلية أو حاوية الصفحات الأمامية ، فسيقوم HOC بتشغيل بعض عمليات التحقق من الصحة على بيانات JSON التي تم تمريرها عبر دعامة البيانات. إذا تم استيفاء جميع الشيكات ، فسيتم إرجاع ArticleContainer مع دعامة pageData واحدة. ستقوم هذه الدعائم Pagedata بتخصيص بيانات JSON التي سيتم تقديمها على سبيل المثال كتل Optimo لمقالة معينة.
HoShchangeHandler Hoc هو غلاف مطبق على جميع الصفحات التي تتحقق من التغييرات في قيمة تجزئة عنوان URL. تتضمن الصفحات عناصر تحكم إمكانية الوصول لتخطي المحتوى في حالة اختيار المستخدم للقيام بذلك ، وهذا يستخدم تجزئة عنوان URL لتخطي المستخدمين إلى مناطق محددة من الصفحة. نظرًا لطبيعة التوجيه جانب العميل ، فإن التغييرات في عنوان URL تؤدي إلى إعادة تقديم. هذا يسبب بعض الواجهة الوظيفية القبيحة لبعض المكونات ، وخاصة وسائل الإعلام والتضمينات الاجتماعية. يطبق هذا المخصص الشيكات على عنوان URL ، لذا تعرف على ما إذا كان إعادة تقديم ضرورة ، أو إذا لم تكن تمنع إعادة تقديم باستخدام React.memo .
مكونات إرجاع ThupTimizelyProvider المخصصة التي تم تعزيزها مع الوصول إلى عميل محسن ، يتم استخدامها لتشغيل اختبار A/B الخاص بنا. يتم ذلك للحد من أحجام الحزم ، حيث أننا نفصل بعض حزمنا حسب نوع الصفحة ، وهذا يعني أنه إذا كنا نقوم فقط باختبار A/B على أنواع معينة من الصفحات ، يمكننا منع حزم تلوث نوع الصفحة مع وزن مكتبة SDK التي نستخدمها لتحقيقها.
يجب إضافة withOptimizelyProvider كقيمة مفتاح كائن handlerBeforeContexts ضمن ApplyBasicPageHandlers.js ، حيث يتم تعيين ckns_mvt ضمن usercontext ، لذلك يجب أن يتم تطبيق ملمس withOptimizelyProvider بالترتيب الصحيح إلى جانب hoc مع concontexts. هذا يجعل ckns_mvt متاحًا في زيارات لأول مرة لتمريرها إلى OptimizelyProvider ، إلى جانب سمات مثل service ، والتي يتم استخدامها لتحديد وقت تمكين التجربة.
مثال على صفحة المقالة:
import withOptimizelyProvider from '#app/legacy/containers/PageHandlers/withOptimizelyProvider' ;
import ArticlePage from './ArticlePage' ;
import applyBasicPageHandlers from '../utils/applyBasicPageHandlers' ;
export default applyBasicPageHandlers ( ArticlePage , {
handlerBeforeContexts : withOptimizelyProvider ,
} ) ;عند إضافة نوع صفحة جديد ، هناك عدة أجزاء مطلوبة.
/data/{{service}}/{{pageType}}/.jsonlocalhost:7080/igbo.json يجب أن يكون لدى البيانات لإنشاء صفحة الفهرس localhost:7080/igbomain flex-grow: 1; إعلان CSS ، هذا هو التأكد من نموها لملء المسافة بين الرأس المرئي وتذييل ، DIV الجذر باستخدام تطبيق Flexbox "لزجة تذييل". cypress/support/config/settings.js لكل خدمة (حتى لو تم تعيين نوع الصفحة الجديد على غير محدد)cypress/integration/pages/cypress/integration/pages/ يجب عليك التأكدNB: مع هذه الخطوات العديدة ، يُقترح أن يكون لديك PRS متعددة عند إضافة نوع صفحة جديد حتى لا يكون لديك علاقات عامة فريدة. ومع ذلك ، إذا لم تتم إضافة اختبارات Cypress (#6) في نفس العلاقات العامة مثل توجيه الصفحة (#5) ، فيجب أن تتبع على الفور توجيه الصفحة PR ، ومن الناحية المثالية ، يجب التعامل معها في PR واحدة.
يرجى قراءة: المساهمة
تثبيت العقدة. https://nodejs.org/en/. نستخدم الإصدار المحدد في .nvmrc ، وإذا كان لديك مدير إصدار Node (NVM) ، فيمكنك تشغيل البرنامج النصي التالي للتغيير تلقائيًا إلى الإصدار المدعوم من المشروع.
nvm use
يستخدم مشروع Simorgh Yarn لإدارة الحزم. يوصى بتثبيت الغزل من خلال مدير حزمة NPM ، والذي يأتي مع Node.js عند تثبيته على نظامك. لتثبيت الغزل ، قم بتشغيل هذا الأمر:
npm install --global yarn
ثم يمكنك تشغيل الأوامر التالية لتثبيت Simorgh
git clone [email protected]:bbc/simorgh.git
cd simorgh
yarn install
لتشغيل هذا التطبيق محليًا ، مع التحميل الساخن ، قم بالتشغيل
yarn dev
سيبدأ التطبيق على http: // localhost: 7080.
يتم تقديم صفحات المقالات في طرق التنسيق /news/articles/:id حيث يكون المعرف هو معرف الأصول الذي تم إنشاؤه بواسطة نظام إدارة المحتوى.
لمعلوماتك: مقال يشرح استخدام بي بي سي للمعرفات في عنوان URL
تتوفر هاتان المادتان الإخباريان في بيئة اختبار CMS الخاصة بنا ، وكذلك محليًا ، لذلك غالبًا ما تستخدم للاختبار:
نحن نقدم أيضًا صفحات AMP HTML في الطريق /news/articles/:id.amp :id.amp https://www.ampproject.org
لا يمكن الوصول إلى الخدمات ذات المتغيرات باستخدام التنسيق أعلاه ، وبدلاً من ذلك يجب توفير المتغير في عنوان URL.
يتم تقديم الصفحات الأمامية للخدمة العالمية بالتنسيق /:service حيث تمثل service موقع خدمة العالم:
تتبع الصفحات الأمامية للخدمة العالمية تنسيق المقالة لـ AMP أيضًا ، حيث تتوفر على /:service.amp :
لا يمكن الوصول إلى الخدمات ذات المتغيرات باستخدام التنسيق أعلاه ، وبدلاً من ذلك يجب توفير المتغير في عنوان URL.
تستخدم صفحات الموضوع واجهات برمجة التطبيقات BBC الداخلية التي لا يمكن الوصول إليها للجمهور. هذا يمكن أن يتسبب في ظهور التحذيرات التالية عند التطور محليًا:
No BFF_PATH set as environment variable, you will not have access to topics
يجب على المطورين الداخليين الذين يحتاجون إلى العمل على صفحات الموضوع محليًا الاتصال بالفريق للوصول.
تستخدم التوصيات في صفحات القصة أيضًا واجهة برمجة تطبيقات BBC Data Labs. يتطلب إضافة زوج المفتاح/القيمة في ملف envConfig/secret.env ليظهروا محليًا.
يجب على المطورين الداخليين الذين يحتاجون إلى العمل على صفحات المقالات محليًا الاتصال بالفريق للوصول.
يمكنك العثور على أنواع الصفحات الأخرى من خلال النظر في طرقنا ورفاقها ، لكننا نقترح عليك البدء في ما سبق ثم إلقاء نظرة على جوهر التطبيق لفهم وإيجاد الطرق الأخرى.
نستخدم Storybook لتطوير المكونات بمعزل عن تطبيق Simorgh. يمكنك الوصول إلى هذا على https://bbc.github.io/simorgh/
لتشغيل yarn storybook محليًا ، سيكون متاحًا عند http: // localhost: 9001/. مقدمة إلى ووثائق القصص القصيرة هنا: https://storybook.js.org/basics/introduction/.
عند عرض قصص الفيديو محليًا ، تأكد من استخدام مجال BBC ، كما هو موضح في قسم موقع الطلب المتغير. لن يعمل الفيديو في الإصدار المستضاف من Storybook المرتبط أعلاه لهذا السبب.
نستخدم أيضًا QA لوني لتشغيل اختبار المتصفح على قصصنا.
يرجى أيضًا ملاحظة أنه إذا كنت ترغب في رؤية المكونات التي يتم تقديمها بخطوطنا ، فستحتاج إلى إجبار طلاء القماش. وذلك لأن جميع خطوطنا تحتوي على خاصية font-display optional أو swap وفقًا لاستراتيجيات التحميل ذات الصلة هنا: https://ws-downloads.files.bbci.co.uk/fonts/index.html. أسهل طريقة لإجبار إعادة النشر هي مجرد نقل المقسم بين نافذة المعاينة وقطع Knobs أو تغيير حجم نافذة المتصفح.
إذا كنت ترغب في استضافة التطبيق ليكون متاحًا من خلال شبكتك المحلية ، فاتبع التعليمات هنا.
لتشغيل هذا التطبيق محليًا مع إنشاء إنتاج ، قم بتشغيل: yarn build && yarn start .
نحن نستخدم yarn build محليًا والذي يحدد التطبيق الذي يشير إلى مضيف محلي للبيانات والأصول الثابتة.
يستخدم هذا بشكل أساسي لتصحيح latest باستخدام حزم الاختبار والبيئة الحية. تأكد من وجود الحزم في موقع الأصول الثابتة للبيئة الصحيحة قبل البدء في التصحيح.
لتشغيل حزم الاختبار على المضيف المحلي:
envConfig/test.env تغيير قيم:LOG_DIR='/var/log/simorgh' to LOG_DIR='log'rm -rf build && yarn build:test && yarn startلتشغيل حزم حية على المضيف المحلي:
envConfig/live.env تغيير قيم:LOG_DIR='/var/log/simorgh' to LOG_DIR='log'rm -rf build && yarn build:live && yarn startتؤدي بعض الميزات بشكل مختلف على ما إذا كان المستخدم موجودًا داخل المملكة المتحدة أو دوليًا. يمكنك طلب إصدار محدد صراحة عن طريق الوصول إلى Simorgh عبر مجال BBC المحلي المحلي:
إذا لم تنجح هذه عناوين URL ، فقد تحتاج إلى إضافة إدخال ملف مضيف ( /etc/hosts أو C:WindowsSystem32driversetchosts ):
127.0.0.1 localhost.bbc.co.uk
127.0.0.1 localhost.bbc.com
عند النشر ، يتم تشغيل make buildCi في بيئة CI التي تنشئ حزمًا لكل من test والبيئات live . في البيئتين ، قم بتعيين ملفات .env.test أو .env.live ، الكتابة فوق ملف .env الذي يتم استخدامه لتشغيل التطبيق باستخدام الحزم الصحيحة.
سيقوم كل مجموعة من yarn build بتحديث ملفات تحليل الحزمة في الريبو. لعرض انهيار لحجم الحزمة ، افتح تقرير HTML الذي webpack-bundle-analyzer إنشاؤه في متصفح ./reports/webpackBundleReport.html تتوفر البيانات أيضًا مثل JSON ./reports/webpackBundleReport.json .
لقد تم ربطنا باستخدام Airbnb Styleguide ونستخدم أجمل كبرمجة. يمكن تشغيلها مع yarn test:lint .
لدينا اختبارات وحدة Jest التي يمكن تشغيلها مع yarn test:unit .
yarn test يدير كلا المجموعتين من هذه.
نحن نستخدم Cypress لاختباراتنا الشاملة. لتشغيل اختبارات الدخان محليًا ، قم بتشغيل هذا الأمر المفرد:
yarn test:e2e
سيتم تدوير خادم الإنتاج على المنفذ 7080 وتشغيل اختبارات Cypress مقابل ذلك. لتشغيل اختبارات الدخان بشكل تفاعلي ، قم بتشغيل:
yarn test:e2e:interactive
يعمل هذا على تحميل واجهة المستخدم التي تسمح بسهولة باختبار اختبارات فردية إلى جانب دفق مرئي للمتصفح ، حيث يتم إجراء الاختبارات.
هناك العديد من متغيرات البيئة التي يمكنك استخدامها مع مجموعة الاختبار الخاصة بنا ، وهي:
| متغير البيئة | تأثير | القيم الممكنة |
|---|---|---|
| cypress_only_service | يقيد تشغيل الخدمة المحددة فقط | خدمة واحدة ie CYPRESS_ONLY_SERVICE=urdu |
| cypress_app_env | يدير الاختبارات في بيئة محددة | test ، local ، live |
| cypress_smoke | يدير اختبارات الدخان فقط إذا كان صحيحًا | true ، false |
| cypress_uk | انظر تشغيل E2Es في المملكة المتحدة ضد Live | true ، false |
| cypress_skip_eu | انظر تشغيل E2es خارج الاتحاد الأوروبي | true ، false |
يمكن تشغيل هذه الأوامر مجتمعة.
الطريقة الافتراضية لتشغيل جناح E2E الملقب yarn test:e2e أو yarn test:e2e:interactive مجموعة فرعية من اختباراتنا ، وإلا معرفة اختبارات الدخان . لتشغيل الجناح الكامل:
CYPRESS_SMOKE=false yarn test:e2e
يمكن تقييد الاختبارات لتشغيلها فقط لخدمة واحدة عن طريق تحديدها باستخدام متغير بيئة CYPRESS_ONLY_SERVICE . على سبيل المثال:
CYPRESS_ONLY_SERVICE=urdu yarn test:e2e
لتشغيل مواصفات معينة فقط ، من الضروري استدعاء Cypress مباشرة. أولا تأكد من تشغيل Simorgh بالفعل في علامة تبويب أخرى ثم تشغيل (على سبيل المثال ، لتشغيل اختبارات المقالات فقط):
npx cypress run --spec cypress/integration/pages/articles/index.js
يمكن العثور على مزيد من التفاصيل حول استخدام Cypress CLI على https://docs.cypress.io/guides/guides/command-line.html
يؤثر هذا على المطورين المتمركزين في المملكة المتحدة فقط (ولكن قد يؤثر عليك إذا كنت تستخدم توجيه VPN عبر المملكة المتحدة)
يتم قفل وظيفة Cypress .Visit () لزيارة مجال واحد لكل اختبار. يصبح هذا مشكلة عند تشغيل اختبارات E2E من داخل المملكة المتحدة ، بسبب إعادة التوجيه من .com إلى .co.uk . بشكل افتراضي ، سيتم تشغيل اختبارات السرو كما لو كانت تم تشغيلها خارج المملكة المتحدة. من أجل إجراء هذه الاختبارات من المملكة المتحدة ، يجب عليك نقل متغير بيئة Cypress في UK إلى الاختبارات. سيحل هذا محل نهايات عنوان URL إلى .co.uk ، والتي ستسمح لك بإجراء هذه الاختبارات بنجاح.
هنا أمر مثال:
CYPRESS_APP_ENV=test CYPRESS_UK=true CYPRESS_SMOKE=true yarn cypress
هذا يؤثر على المطورين المتمركزين في الاتحاد الأوروبي (ولكن قد يؤثر عليك إذا كنت تستخدم توجيه VPN عبر بلد وليس في الاتحاد الأوروبي)
لن يُظهر إجراء اختبارات Cypress خارج الاتحاد الأوروبي لافتات موافقة الاتحاد الأوروبي على AMP ، وقد يتسبب ذلك في فشل بعض الاختبارات. قم بتعيين CYPRESS_SKIP_EU=true لمنع هذه الاختبارات من التشغيل عند خارج الاتحاد الأوروبي.
سيكون أمر مثال:
CYPRESS_SKIP_EU=true yarn cypress:interactive
يقوم الأمر التالي بتشغيل كل من Simorgh و Cypress:
CYPRESS_APP_ENV=local CYPRESS_UK=true CYPRESS_SMOKE=true yarn test:e2e
يمكن أيضًا تعيين Cypress_app_env مساوية لـ "الاختبار" و "Live". يمكن أن يكون Cypress_smoke صحيحًا أو خطأ. هذا صحيح بشكل افتراضي ويدير مجموعة فرعية محددة من الاختبارات.
نستخدم Lighthouse لاختبار أداء صفحتنا. ومع ذلك ، فقد تم نقلها من Simorgh وصولاً إلى عمليات الأقراص المضغوطة الداخلية الخاصة بنا. هذا يتيح لنا إجراء هذه الاختبارات على تصوير أكثر دقة لسيمورغ. أنت حر في تشغيل Lighthouse بمفردك من متصفح Chrome الخاص بك أو استخدام Node Lighthouse CLI.
اسمه سيمورغ بعد الطائر الأسطوري الفارسي. Simorgh هي مزيج العديد من الطيور (وفي بعض الروايات حيوانات أخرى) إلى واحدة.
لحسن الحظ ، فإن الاستعارة التي بدت ملائمة لتقديم جميع مقالات بي بي سي في حل واحد ربما تكون أكثر ملاءمة لأن التطبيق يتطور لدعم المزيد من أنواع المحتوى. إنها أيضًا إشارة واضحة إلى الطبيعة الدولية لفرقنا ، ولكن أيضًا إلى الرغبة في ضمان المقالات (وكل ما تابعت) للمستخدمين بجميع اللغات التي تدعمها بي بي سي.
إنه أيضًا اسم فريد عملي ، وأكثر سطحية ، الطائر جميل جدًا.