سؤال

أجد أن Yii Great Framework ، والمثال على الويب الذي تم إنشاؤه مع Yiic Shell هو نقطة جيدة للبدء ... ومع ذلك فهو لا يغطي موضوع مواقع الويب متعددة اللغة ، للأسف. يغطي المستندات موضوع ترجمة الرسائل القصيرة ، ولكن لا يحتفظ بالمحتوى متعدد اللغات ...

أنا على وشك البدء في العمل على موقع ويب يجب أن يكون بلغتين على الأقل ، وأتساءل ما هي أفضل طريقة للحفاظ على المحتوى لذلك ... المشكلة هي أن المحتوى مختلط على نطاق واسع مع العناصر المشتركة (مثل ملفات الفيديو المدمجة).

أحتاج إلى تجنب تكرار تلك العموم ... حتى الآن اعتدت أن يكون لدي مجموعة من المصفوفات التي تحتوي على نصوص (عادة ما لا تزيد عن 1-2 فقرات قصيرة) ، ثم كان ملف العرض يقدم النص من صفيف.

الآن أود تجنب الاحتفاظ بها في المصفوفات (والتي تتطلب بعض الاهتمام عند وضع الاقتباسات المزدوجة "" وهي غير مريحة بشكل عام ...).

إذن ، ما هي أفضل طريقة للحفاظ على تلك الفقرات القصيرة؟ هل يجب أن أبقيها في db مثل (id | msg_id | لغة | المحتوى) ثم حددها بواسطة msg_id واللغة؟ لا يزال هذا يتطلب مني إنشاء بعض msg_id وتضمينها في ملف العرض ...

هل هناك أي نموذج موصى به من بين YII بعض الحلول؟

شكرا م.

هل كانت مفيدة؟

المحلول

يستخدم تطبيق Yii افتراضيًا طريقة yii :: t () لترجمة الرسائل النصية وهناك 3 أنواع مختلفة لمصادر الرسائل:

  1. CPHPMessagesource : يتم تخزين الترجمات كأزواج القيمة الرئيسية في صفيف PHP.
  2. cgetTextMessagesource : يتم تخزين الترجمات كملفات gnu getText. (ملفات PO)
  3. CDBMessagesource : يتم تخزين ترجمات الرسائل في جداول قاعدة البيانات.

إذا لم أسيء فهمها ، فأنت تستخدم المصفوفات الكلاسيكية للترجمات. أوصيك باستخدام ملفات GetText و PO مع YII لعمليات الترجمة.

يمكنك العثور على الكثير من المعلومات حول الترجمة و I18N مع YII في هذا صفحة الوثائق الرسمية.

نصائح أخرى

يعد GetText مفيدًا لسهولة الترجمة ، لكن تطبيق PHP الافتراضي ليس آمنًا. لذلك يستخدم Yii فصله الخاص ، مما يزيد من وقت المعالجة بشكل كبير مقارنةً بصفائف PHP.

نظرًا لأنني كنت أقوم بإعداد موقع معاملات عالية الحجم ، فإن ضربة الأداء لم تكن مقبولة. أيضًا ، باستخدام APC ، يمكننا تخزين ترجمة PHP زيادة الأداء.

لذلك كان نهجي هو استخدام صفائف PHP ولكن للحفاظ على الترجمات في ديسيبل لسهولة الترجمة ، وإنشاء الملفات المطلوبة عند تغيير الترجمات.

DB يشبه هذا:

TABLE Message            // stores source language, updated by script
 id INT UNSIGNED
 category VARCHAR(20)         // first argument to Yii::t()
 key TEXT                     // second argument to Yii::t()
 occurences TINYINT UNSIGNED  // number of times found in sources

TABLE MessageTranslation // stores target language, translated by human  
 id INT UNSIGNED
 language VARCHAR(3)          // ISO 639-1 or 639-3, as used by Yii
 messageId INT UNSIGNED       // foreign key on Message table
 value TEXT
 version VARCHAR(15)
 creationTime TIMESTAMP DEFAULT NOW()
 lastModifiedTime TIMESTAMP DEFAULT NULL
 lastModifiedUserId INT UNSIGNED

قمت بعد ذلك بتعديل أمر CLI tool yiic "رسالة" لتفريغ السلاسل التي تم جمعها في DB.

http://www.yiiframework.com/wiki/41/how-to-extend-yiic-shell-commands/

بمجرد الوصول إلى DB ، يمكن إعداد CMS البسيطة لتزويد المترجمين طريقة سهلة للترجمة وفي نفس الوقت توفير معلومات الإصدار ، والعودة إلى الإصدارات القديمة ، والتحقق من جودة المترجمين ، وما إلى ذلك ...

نص آخر ، تم تعديله أيضًا من YIIC ، ثم يأخذ معلومات DB ويقوم بتجميعه في صفائف PHP. في الأساس انضمام للجدولين لكل لغة ، ثم قم بإنشاء صفيف باستخدام "رسالة". "مفتاح" و "messageTranslation". رسالة "." الفئة "في المجلد المحدد بواسطة اللغة.

يتم تحميل الملفات التي تم إنشاؤها كالمعتاد بواسطة YII CPHPMessagesource.

بالنسبة للصور ، كان هذا بسيطًا مثل وضعها في مجلدات باللغة المناسبة والحصول على لغة التطبيق عند الارتباط.

<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">

لاحظ أنه في الحياة الواقعية ، كتبت طريقة مساعدة صغيرة لتجريد البلاد من سلسلة اللغة ، يجب أن تكون "EN_US" "EN".

حسنًا ، أعتقد أن ما يهتم هنا هو كيفية ترجمة النص/الرسائل الثابتة على الصفحة ، ويحلها YII بشكل جيد باستخدام yii: t () وإجابة Edigu لها.

أتحقق من المنشور على FlexicAcms حول ترجمة المحتوى الديناميكي في قاعدة البيانات ، في النهاية سيكون هذا هو التالي بعد حل مشكلة النص/الرسالة الثابتة ، وهذا نهج جيد حقًا باستخدام سلوك Yii. لست متأكدًا مما إذا كان مؤلفو FlexicAcms طموحًا جدًا في دعم الترجمة بهذه الطريقة لأنها ستجعل ترجمة المحتوى شيئًا خاليًا من القلق - رائع حقًا.

شيء واحد لا يذكرونه هو عنوان URL للصفحة المترجمة. على سبيل المثال your.site.com/fr/translated_article_title.html. أعني أن عنوان URL يجب أن يكون / لغة / جزء منه حتى يتمكن من المساعدة في تحسين محركات البحث.

في Yii1 و Yii2 yii i18n getTextMessagesource لا يستخدم محرك ذاكرة التخزين المؤقت المثالية على أي حال (انظر إلى المصدر) لتعزيز تحميل ملفات Po أو Mo. لا ينصح بتحميل هذه الملفات باستخدام رمز PHP Pure (بما في ذلك yii i18n getTextMessagesource) (إنه أبطأ جدًا من PHP Array IDX):http://mel.melaxis.com/devblog/2006/04/10/benchming-php-localization-is-gettext-fast-enough/

ومع ذلك ، فإن php gettext ext لملفات MO أسرع من مجموعة PHP Translation لأنها تستخدم ذاكرة التخزين المؤقت ولكن النقطة السلبية هي: كل تغيير في MO يتطلب إعادة تشغيل الخادم.

أعتقد أن أفضل حل هو تمديد yii i18n getTextMessagesource في مكتبة الكود الخاصة بك وإضافة قدرة ذاكرة التخزين المؤقت إلى الحصول على messagesource لتعزيز أدائها واستخدام نسختك الموسعة كمكون.

protected function loadMessages($category, $language);

فقط لا تحقق من تاريخ MO المعدل في كل حمل للمقارنة مع ذاكرة التخزين المؤقت ، بدلاً من ذلك ، قم بمسح ذاكرة التخزين المؤقت عند تغيير ملفات MO أو PO (يمكن أن يكون جدولًا).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top