我找到它伟大的框架,例如网站创建按照和以下一致的壳是一个良好的起点...但是它没有涵盖的主题的多语言网站,不幸的。该文件涵盖的主题的翻译简短的消息,但不能保持多语种内容...

我要开始工作,在一个网站,需要在至少两种语言,我想知道什么是最好的方式来保持的内容。问题是,内容是混合的广泛应用共同的要素(如嵌入式的视频文件)。

我需要避免重复这些共用...迄今为止我曾经有一阵阵列包含的文本(通常为不超过1-2小段),然后视文件只是渲染的文本从一个阵列。

现在我想要避免保持它在阵列(其需要注意的时候,把双语录""并不方便的一般...).

那么,什么是最好的方式来保持这些简短的段落?我应该让他们在DB像(id|消息语文|内容的),然后选择他们的消息和语言?这还要求我建立一些消息和嵌入他们看到的文件...

是否有任何建议的模式用于其它有一些解决方案?

谢谢, m。

有帮助吗?

解决方案

一个它应用程序默认情况下使用它::t()方法翻译文本的消息和有3种不同类型的消息来源:

  1. CPhpMessageSource :翻译存储为key-value a PHP array.
  2. CGettextMessageSource :翻译存储为GNU Gettext文件。(PO文件)
  3. 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文件被更改(也可以是一个时间表)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top