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种不同的类型:
如果我没有误解,你使用经典数组进行翻译.我建议您使用带有Yii的GetText和PO文件进行翻译操作.
您可以在此官方文档页面中找到有关翻译和i18n的大量信息.
| 归档时间: |
|
| 查看次数: |
25206 次 |
| 最近记录: |