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

2022-08-30 18:27:35

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

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

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

现在我想避免将其保存在数组中(这在放置双引号“ ”时需要一些注意,并且通常不方便...)。

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

有没有推荐的范式,Yii有一些解决方案?

谢谢,m。


答案 1

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

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

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

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

另一个脚本,也是从 yiic 修改而来的,然后获取 DB 信息并将其编译为 PHP 数组。基本上是每种语言的两个表的JOIN,然后使用'Message'构建一个数组。键'和'消息翻译'。value' as (what else?) key => value ...保存到以“消息”命名的文件。按语言指定的文件夹中的类别。

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

对于图像,这就像将它们放在具有正确语言的文件夹中并在链接时获取应用程序语言一样简单。

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

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


答案 2

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

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

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

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


推荐