Yii:多语言网站 - 最佳实践

mig*_*jek 23 php internationalization yii

我发现Yii很棒的框架,用yiic shell创建的示例网站是一个很好的起点......但不幸的是,它没有涉及多语言网站的主题.文档涵盖了翻译短消息的主题,但没有保留多语言内容......

我即将开始在一个需要至少两种语言的网站上工作,我想知道保持内容的最佳方法是什么......问题是内容与公共元素广泛混合(比如嵌入的视频文件).

我需要避免重复那些公共...到目前为止我曾经有一个包含文本的数组(通常不超过1-2个短段),然后视图文件只是从数组渲染文本.

现在我想避免将它保留在数组中(当引用双引号时需要注意一些""并且通常不方便......).

那么,保留这些短段落的最佳方法是什么?我应该将它们保存在DB(id | msg_id | language | content)中,然后通过msg_id和语言选择它们吗?这还需要我创建一些msg_id并将它们嵌入到视图文件中......

是否有任何推荐的范例Yii有一些解决方案?

谢谢,m.

ian*_*aré 19

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
Run Code Online (Sandbox Code Playgroud)

然后,我修改了CLI工具yiic'message'命令,将收集的字符串转储到DB中.

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

一旦进入数据库,就可以设置一个简单的CMS,为翻译提供一种简单的翻译方式,同时提供版本信息,恢复旧版本,检查翻译质量等等......

另一个脚本也是从yiic修改的,然后获取DB信息并将其编译成PHP数组.基本上是每种语言的两个表的JOIN,然后使用'Message'构建一个数组.'key'和'MessageTranslation'.'value'as(还有什么?)key => value ...保存到名为'的文件'消息'.'类别'在语言指定的文件夹中.

生成的文件由Yii CPhpMessageSource正常加载.

对于图像,这很简单,只需将它们放在具有适当语言的文件夹中,并在链接时获取应用程序语言.

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

请注意,在现实生活中,我写了一个小帮手方法来从语言字符串中删除国家,'en_us'应该是'en'.


edi*_*igu 17

Yii应用程序默认使用yii :: t()方法来翻译文本消息,消息源有3种不同的类型:

  1. CPhpMessageSource:翻译作为键值对存储在PHP数组中.
  2. CGettextMessageSource:翻译存储为GNU Gettext文件.(PO文件)
  3. CDbMessageSource:消息转换存储在数据库表中.

如果我没有误解,你使用经典数组进行翻译.我建议您使用带有Yii的GetText和PO文件进行翻译操作.

您可以在此官方文档页面中找到有关翻译和i18n的大量信息.