题
我找到它伟大的框架,例如网站创建按照和以下一致的壳是一个良好的起点...但是它没有涵盖的主题的多语言网站,不幸的。该文件涵盖的主题的翻译简短的消息,但不能保持多语种内容...
我要开始工作,在一个网站,需要在至少两种语言,我想知道什么是最好的方式来保持的内容。问题是,内容是混合的广泛应用共同的要素(如嵌入式的视频文件)。
我需要避免重复这些共用...迄今为止我曾经有一阵阵列包含的文本(通常为不超过1-2小段),然后视文件只是渲染的文本从一个阵列。
现在我想要避免保持它在阵列(其需要注意的时候,把双语录""并不方便的一般...).
那么,什么是最好的方式来保持这些简短的段落?我应该让他们在DB像(id|消息语文|内容的),然后选择他们的消息和语言?这还要求我建立一些消息和嵌入他们看到的文件...
是否有任何建议的模式用于其它有一些解决方案?
谢谢, m。
解决方案
一个它应用程序默认情况下使用它::t()方法翻译文本的消息和有3种不同类型的消息来源:
- CPhpMessageSource :翻译存储为key-value a PHP array.
- CGettextMessageSource :翻译存储为GNU Gettext文件。(PO文件)
- CDbMessageSource :消息翻译存储在数据库的数据表。
如果我不要误会,你是用经典阵列,用于翻译。我向你推荐使用GetText和PO文件与它用于翻译的行动。
你可以找到大量的信息,翻译和i18n与它在这 官方文件的页面.
其他提示
Gettext的是其易于翻译的不错,但是默认的PHP实现不是线程安全的。因此YII使用它自己的解包器,大大提高了处理时间相比,PHP阵列。
由于我建立一个高容量,高交易现场,性能损失是不能接受的。此外,通过使用APC,我们可以缓存PHP翻译进一步提高性能。
我的方法因此是使用PHP数组但为了保持在DB翻译为便于翻译,产生所需的文件时的翻译被改变。
在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工具的yiic“消息”命令转储收集串到DB。
http://www.yiiframework.com /维基/ 41 /如何对延伸-的yiic壳命令/
一旦进入数据库,一个简单的CMS可以设置为译者提供一个简单的方法来翻译,并在同一时间提供版本信息,回复到旧版本,检查翻译的质量,等等...
另一脚本,也从的yiic修改,则取DB信息并将其编译为PHP阵列。基本上是一个连接两个表为每种语言的,然后建立使用“消息”的数组。“关键”和“MessageTranslation”。“值”作为(什么?)键=>值...保存到从指定的文件“消息”。‘在按语言指定的文件夹分类’。
生成的文件被Yii CPhpMessageSource加载为正常。
有关的图像,这是一样简单将它们放置在文件夹中以适当的语言和获取链接时,应用程序语言。
<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">
请注意,在现实生活中,我写了一个小的辅助方法,从语言字符串脱光国家“EN_US”应该是“恩”。
那么我想在这里关注的是如何很好利用翻译的页面和Yii的解决它的静态文本/消息的Yii:T(),并也迪古的回答是它
我检查出的职位上FlexicaCMS关于翻译数据库中的动态内容,以及最终将成为下一个你解决静态文本/消息后的问题,那就是使用Yii的行为,真正的好方法。不知道FlexicaCMS作者是支持翻译过于雄心勃勃这种方式,因为它将使内容翻译无忧的东西 - 真是太好了
他们做一件事不提的是翻译网页的网址。例如your.site.com/fr/translated_article_title.html。我指的是广告客户必须在其/ LANGUAGE_ID /部分,因此它可以与搜索引擎优化帮助。
在Yii1和Yii2 YII \ I18N \ GettextMessageSource不使用的Yii完美缓存引擎反正(看看源),以提高的PO或MO文件的负载。它不推荐使用PHP纯代码来加载这些文件(包括YII \ I18N \ GettextMessageSource)(它是如此慢于PHP数组IDX): 的http://梅尔。 melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/
但是PHP的gettext分机的MO文件比翻译PHP数组快一些,因为它使用的缓存,但不利点是:在MO的每一个变化需要重新启动服务器
我认为最好的解决办法是延长警予\国际化\ GettextMessageSource在自己的代码库,并添加缓存能力GettextMessageSource,以提高其性能,并使用你的扩展版本的组件。
protected function loadMessages($category, $language);
只是不检查MO修改日期在每一个负荷来比较缓存,而不是清除缓存时,MO或PO文件被更改(也可以是一个时间表)。