Yii:多

我发现Yii很棒的框架,用yiic shell创建的示例网站是一个很好的开始......但不幸的是,它并没有涵盖多语言网站的主题。 该文档涵盖翻译短信的主题,但不包含多语言内容......

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

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

现在我想避免把它放在数组中(当把双引号括起来时需要注意一些“”,并且总体上不方便...)。

那么,保留这些短段的最好方法是什么? 我应该像数据库一样保存它们(id | msg_id | language | content),然后通过msg_id和language选择它们吗? 这仍然需要我创建一些msg_id并将它们嵌入到视图文件中...

Yii有什么建议的范例有一些解决方案?

谢谢,米。


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

  • CPhpMessageSource:翻译存储为PHP数组中的键值对。
  • CGettextMessageSource:翻译存储为GNU Gettext文件。 (PO文件)
  • CDbMessageSource:消息转换存储在数据库表中。
  • 如果我没有误解,你正在使用经典的数组进行翻译。 我建议你在Yii上使用GetText和PO文件进行翻译操作。

    你可以在这个官方文档页面找到很多关于翻译和iii的信息。


    Gettext对于易于翻译很有好处,但默认的PHP实现不是线程安全的。 Yii因此使用它自己的解包器,与php数组相比,它大大增加了处理时间。

    自从我设立一个高容量,高交易站点以来,性能不佳是不可接受的。 另外,通过使用APC,我们可以缓存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'message'命令,将收集的字符串转储到数据库中。

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

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

    另一个脚本,也从yiic修改,然后采取数据库信息和编译到PHP数组。 基本上是每种语言的两个表的JOIN,然后使用'Message','key'和'MessageTranslation','value'作为(还有什么?)key => value ...来保存到名为'消息'。'category'在由语言指定的文件夹中。

    生成的文件通过Yii CPhpMessageSource正常加载。

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

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

    请注意,在现实生活中,我写了一个辅助方法从语言字符串中剥离国家,'en_us'应该是'en'。


    那么我认为这里关心的是如何翻译页面上的静态文本/消息,Yii使用Yii解决了它:t()和Edigu的答案就是这样。

    我在FlexicaCMS上查看关于在数据库中翻译动态内容的文章,最后在解决静态文本/消息问题之后这将是下一个,这是使用Yii行为的一个真正的好方法。 不确定FlexicaCMS作者是否过于雄心勃勃地支持翻译,因为它会使内容翻译成为一件无忧的事情 - 非常棒。

    他们没有提到的一件事是翻译页面的网址。 例如your.site.com/fr/translated_article_title.html。 我的意思是url必须有/ language_id / part,所以它可以帮助搜索引擎优化。

    链接地址: http://www.djcxy.com/p/37483.html

    上一篇: Yii: Multi

    下一篇: Best practice to make a multi language application in C#/WinForms?