2010-03-23 8 views
23

मुझे वाईआई महान ढांचा मिल गया है, और यिक शैल के साथ बनाई गई उदाहरण वेबसाइट शुरू करने के लिए एक अच्छी बात है ... हालांकि दुर्भाग्य से बहु भाषा वेबसाइटों के विषय को कवर नहीं किया गया है । दस्तावेज़ों में छोटे संदेशों का अनुवाद करने के विषय को शामिल किया गया है, लेकिन बहुभाषी सामग्री को नहीं रखा गया है ...वाईआई: बहु भाषा वेबसाइट - सर्वोत्तम प्रथाओं

मैं ऐसी वेबसाइट पर काम करना शुरू कर रहा हूं जिसकी कम से कम दो भाषाओं में होना आवश्यक है, और मैं सोच रहा हूं इसके लिए सामग्री रखने का सबसे अच्छा तरीका क्या है ... समस्या यह है कि सामग्री को आम तत्वों (जैसे एम्बेडेड वीडियो फ़ाइलों) के साथ बड़े पैमाने पर मिश्रित किया जाता है।

मुझे उन कॉमन्स को डुप्लिकेट करने से बचने की ज़रूरत है ... अब तक मुझे ग्रंथों (आमतौर पर 1-2 से अधिक छोटे अनुच्छेदों) वाले सरणी की सरणी होती थी, तो दृश्य फ़ाइल केवल सरणी से पाठ को प्रस्तुत करती थी ।

अब मैं इसे सरणी में रखने से बचना चाहता हूं (जिसके लिए डबल कोटेशन डालने पर कुछ ध्यान देने की आवश्यकता है और सामान्य रूप से असुविधाजनक है ...)।

तो, उन छोटे अनुच्छेदों को रखने का सबसे अच्छा तरीका क्या है? क्या मुझे उन्हें डीबी में रखना चाहिए (आईडी | msg_id | भाषा | सामग्री) और फिर उन्हें msg_id & भाषा द्वारा चुनें? इसके लिए मुझे अभी भी कुछ msg_ids बनाने और उन्हें फ़ाइल में एम्बेड करने की आवश्यकता है ...

क्या कोई अनुशंसित प्रतिमान है जिसके लिए वाईआई के कुछ समाधान हैं?

धन्यवाद, मीटर। पाठ संदेश के अनुवाद के लिए

उत्तर

17

एक Yii आवेदन डिफ़ॉल्ट रूप से Yii का उपयोग करता है :: टी() विधि और वहाँ संदेश स्रोतों के लिए 3 अलग अलग प्रकार के होते हैं:

  1. CPhpMessageSource: अनुवाद एक PHP में कुंजी-मान जोड़ों के रूप में जमा हो जाती है सरणी।
  2. CGettextMessageSource: अनुवाद जीएनयू गेटटेक्स्ट फ़ाइलों के रूप में संग्रहीत हैं। (पीओ फ़ाइलें)
  3. CDbMessageSource: संदेश अनुवाद डेटाबेस तालिका में संग्रहीत हैं।

यदि मुझे गलत समझा नहीं जाता है, तो आप अनुवाद के लिए क्लासिक सरणी का उपयोग कर रहे हैं। मैं आपको अनुवाद संचालन के लिए वाईआई के साथ गेटटेक्स्ट और पीओ फाइलों का उपयोग करने की सलाह देता हूं।

आप इस official documentation page में yii के साथ अनुवाद और i18n के बारे में बहुत सारी जानकारी प्राप्त कर सकते हैं।

+0

गेटटेक्स्ट आईएमओ के साथ समस्या यह है कि उन्हें बनाए रखना और अद्यतन रखना मुश्किल है, आप परमाणु मुद्दों में भी भाग सकते हैं। मेरी पसंदीदा विधि डेटाबेस है ताकि आप फ्लाई पर संदेश अपडेट कर सकें। यदि आप वास्तव में गति चाहते हैं GetText तेज है अन्यथा डीबी जाने का रास्ता है। – Atherion

+0

नोट: मैं कैश के बिना GettextMessageSource का उपयोग न करने की सलाह देता हूं।शुद्ध PHP gettext प्रदर्शन php सरणी से बहुत धीमा है (yii2 स्वयं php arrays का उपयोग करता है) क्योंकि यह फ़ाइलों को दोबारा पढ़ता है, हालांकि php gettext एक्सटेंशन (बनाम gettext शुद्ध php code) का उपयोग php सरणी से कुछ तेज़ है लेकिन php ext का उपयोग करने के लिए सर्वर पुनरारंभ करना आवश्यक है प्रत्येक परिवर्तन के लिए। http://mel.melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/ – Alix

1

अच्छी तरह से मुझे लगता है कि यहां क्या चिंता है पृष्ठ पर स्थिर पाठ/संदेश का अनुवाद कैसे करें और वाईआई इसे वाईआई: टी() और एडिगु का उत्तर का उपयोग करके बहुत अच्छी तरह से हल करता है।

मैं डेटाबेस में गतिशील सामग्री का अनुवाद करने के बारे में फ्लेक्सिका सीएमएस पर पोस्ट की जांच करता हूं, अंततः स्थिर टेक्स्ट/संदेश समस्या हल करने के बाद यह अगला होगा, और यह वाईआई के व्यवहार का उपयोग करके वास्तव में एक अच्छा दृष्टिकोण है। निश्चित नहीं है कि फ्लेक्सिका सीएमएस लेखक अनुवाद का समर्थन करने में बहुत महत्वाकांक्षी हैं, क्योंकि यह सामग्री अनुवाद को चिंता-मुक्त चीज़ बना देगा - वास्तव में बहुत अच्छा।

एक चीज जिसका उल्लेख नहीं है वह अनुवादित पृष्ठ का यूआरएल है। उदाहरण के लिए your.site.com/fr/translated_article_title.html। मेरा मतलब है कि url में/language_id/भाग होना चाहिए ताकि यह एसईओ के साथ मदद कर सके।

19

गेटटेक्स्ट अनुवाद की आसानी के लिए अच्छा है, लेकिन डिफ़ॉल्ट PHP कार्यान्वयन थ्रेड सुरक्षित नहीं है।इसलिए वाईआई अपने स्वयं के अनपेकर का उपयोग करता है, नाटकीय रूप से प्रोसेसिंग समय को पीएचपी सरणी की तुलना में बढ़ाता है।

चूंकि मैं उच्च मात्रा, उच्च लेनदेन साइट स्थापित कर रहा था, प्रदर्शन हिट स्वीकार्य नहीं थी। इसके अलावा, एपीसी का उपयोग करके, हम PHP अनुवाद को और बढ़ते प्रदर्शन को कैश कर सकते हैं।

इसलिए मेरा दृष्टिकोण PHP सरणी का उपयोग करना था, लेकिन अनुवादों को आसानी से अनुवाद के लिए डीबी में रखने के लिए, अनुवादों को बदलते समय आवश्यक फ़ाइलों को उत्पन्न करना था।

डीबी इस के समान है:

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 उपकरण yiic 'संदेश' कमांड संशोधित डीबी में एकत्र तार डंप करने के लिए।

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

एक बार डीबी में, एक सरल सीएमएस अनुवादकों का अनुवाद करने के लिए एक आसान तरीका प्रदान करने के लिए सेटअप किया जा सकता है और एक ही समय में वर्ज़निंग जानकारी प्रदान करने, पुराने संस्करणों पर वापस लौट रहा, अनुवादकों की गुणवत्ता की जाँच, आदि ..

एक और स्क्रिप्ट, जिसे यियिक से भी संशोधित किया गया है, फिर डीबी जानकारी लेता है और इसे PHP सरणी में संकलित करता है। मूल रूप से प्रत्येक भाषा के लिए दो तालिकाओं में से एक जॉइन, फिर 'संदेश' का उपयोग करके एक सरणी बनाएं। 'कुंजी' और 'संदेश ट्रान्सलेशन'। 'मान' के रूप में (और क्या?) कुंजी => मान ... नाम से फ़ाइल में सहेजना ' भाषा द्वारा निर्दिष्ट फ़ोल्डर में संदेश '।' श्रेणी '।

जेनरेट की गई फ़ाइलें Yii CPhpMessageSource द्वारा सामान्य के रूप में लोड की जाती हैं।

छवियों के लिए, यह उन्हें उचित भाषा के साथ फ़ोल्डर्स में रखने और लिंक करने पर ऐप भाषा प्राप्त करने जितना सरल था।

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

नोट वास्तविक जीवन में, मैं ने लिखा है कि भाषा स्ट्रिंग, 'en_us' होना चाहिए 'en' से देश बंद पट्टी एक छोटे से सहायक विधि।

0

Yii1 और Yii2 yii \ i18n \ GettextMessageSource में पीओ या एमओ फ़ाइलों के भार को बढ़ाने के लिए वाईआई सही कैश इंजन का उपयोग नहीं करता है (स्रोत देखें)। http://mel.melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/

हालांकि एमओ फ़ाइलों के लिए php gettext ext कुछ अनुवाद php की तुलना में तेजी है: यह (Yii \ i18n \ GettextMessageSource सहित) php शुद्ध कोड का उपयोग करके इन फ़ाइलों को लोड करने के लिए (यह php सरणी IDX से तो धीमी है) की सिफारिश नहीं कर रहा है सरणी क्योंकि यह कैश का उपयोग करता है लेकिन नकारात्मक बिंदु यह है: MO में प्रत्येक परिवर्तन सर्वर को पुनरारंभ करने की आवश्यकता होती है।

मुझे लगता है कि सबसे अच्छा समाधान आपकी कोड लाइब्रेरी में yii \ i18n \ GettextMessageSource को विस्तारित करना होगा और इसके प्रदर्शन को बढ़ाने के लिए कैश क्षमता को GettextMessageSource जोड़ना होगा और घटक के रूप में अपने विस्तारित संस्करण का उपयोग करना होगा।

protected function loadMessages($category, $language); 

बस हर भार में एमओ संशोधित तिथि जाँच नहीं कैश के खिलाफ तुलना करने के लिए, के बजाय स्पष्ट कैश जब एमओ या पीओ फ़ाइलों को परिवर्तित कर रहे हैं (यह एक समय हो सकता है)।

संबंधित मुद्दे