libriciel / cakephp-translator
CakePHP 2.x 插件,用于简化跨多个域的翻译
Requires
- php: >=5.3.0
README
描述
Translator 插件允许在多个域上执行翻译,并提供“覆盖”或“继承”翻译的能力。
第一需求
在一个业务应用中,同一逻辑实体(业务实体)在不同的上下文中可能有不同的名称。
例如,如果我们有一个数据库表 recipes
,用于记录烹饪食谱(关联的模型是 Recipe
),包含一个 name
字段表示食谱名称和一个 cooking_time
字段表示烹饪时间,我们可能需要以下翻译。
在管理员看到的食谱列表中(/recipes/admin_index)
Recipe.name
: 标题Recipe.cooking_time
: 烹饪时间
在单个食谱的详细信息中(/recipes/view/<id>
)
Recipe.name
: 烹饪食谱Recipe.cooking_time
: 烹饪时间
Recipe.name
的翻译不同,而 Recipe.cooking_time
的翻译相同。
第二需求
有时,这类应用程序的客户可能希望使用不同的词汇来描述相同的业务实体。
例如,对于另一位法语客户,我们需要确保 Recipe.name
在食谱详细信息中的标题是 烹饪食谱。
需求总结
当存在重复或特殊情况下,维护翻译文件可能会变得漫长而繁琐。
因此,应该只将逻辑实体的翻译出现一次,但仍然有在特定页面或针对特定客户进行特殊化的能力,而不需要修改应用程序代码,只需修改翻译文件。
此外,实时搜索翻译会对应用程序的性能产生负面影响。因此,在生产模式下,需要根据上下文维护翻译的缓存。
解决方案
配置文件
在所有法语客户的 app/Config/bootstrap.php
文件中。
// Remarque: en CakePHP < 2.4.0, la valeur serait "fre"
Configure::write( 'Config.language', 'fra' );
CakePlugin::load( 'Translator', array( 'bootstrap' => true ) );
在另一位法语客户的 app/Config/bootstrap.php
文件中,更低的部分
Configure::write( 'Translator.suffix', 'monclient' );
在 AppController
类中
public $components = array(
'TranslatorAutoload'
);
将按顺序考虑以下域进行翻译
<插件>
_<控制器>
_<操作>
_<后缀>
<插件>
_<控制器>
_<操作>
<控制器>
_<操作>
_<后缀>
<控制器>
_<操作>
<控制器>
_<后缀>
<控制器>
- default_
<后缀>
- default
带有明确的默认参数
public $components = array(
'TranslatorAutoload' => array(
// Le nom de la classe utilitaire utilisée pour les traductions
'translatorClass' => 'Translator',
// Les événements permettant de charger et de sauvegarder le cache des traductions "magiques"
// Par défaut, les traductions sont chargées à l'initialisation du component
// et sauvegardées soit juste avant la redirection, soit juste après le rendu de la page
'events' => array(
'initialize' => 'load',
'startup' => null,
'beforeRender' => null,
'beforeRedirect' => 'save',
'shutdown' => 'save'
)
)
);
翻译文件
对于法语客户,这些文件位于 app/Locale/fra/LC_MESSAGES
目录中(或在 CakePHP < 2.4.0 中为 app/Locale/fre/LC_MESSAGES
)。
recipes.po
此文件包含 recipes
控制器页面的一般翻译。
msgid "Recipe.cooking_time"
msgstr "Temps de cuisson"
recipes_admin_index.po
此文件包含 recipes
控制器的 admin_index
页面的翻译。
msgid "Recipe.name"
msgstr "Titre"
recipes_view.po
此文件包含 recipes
控制器的 view
页面的翻译。
msgid "Recipe.name"
msgstr "Recette culinaire"
recipes_view_monclient.po
此文件包含对控制器 recipes
中 view
页面的翻译,用于我的另一位法语客户,其标识为 monclient
。
msgid "Recipe.name"
msgstr "Recette de cuisine"
上下文相关翻译
因此,在我的控制器或视图中,我可以使用以下代码。
// Notation abrégée, équivalente à la fonction __() de CakePHP
// Autre notation abrégée, équivalente à la fonction __n() de CakePHP est __mn()
echo __m( 'Recipe.name' );
// Notation plus longue, avec la classe utilitaire Translator, équivalente à la fonction __() de CakePHP
App::uses( 'Translator', 'Translator.Utility' );
echo Translator::getInstance()->translate( 'Recipe.name' );
// Autre notation plus longue, avec la classe utilitaire Translator, équivalente à la fonction __n() de CakePHP
// echo Translator::getInstance()->translate( '<singulier>', '<pluriel>', <count> );
插件类扩展
@todo (接口 Translator.TranslatorInterface) + 示例
兼容性
已测试与 PHP 5.5.9、CakePHP 2.2.4 和 2.9.0 兼容。
使用 Jenkins 进行持续集成
测试
sudo -u www-data ant quality -f plugins/Translator/Vendor/Jenkins/build.xml
准备
sudo -u www-data ant clear -f plugins/Translator/Vendor/Jenkins/build.xml
mkdir app/tmp/build
sudo chmod a+rw app/tmp/build
wget https://:8080/jnlpJars/jenkins-cli.jar
在 Jenkins 中添加作业
java -jar jenkins-cli.jar -s https://:8080 create-job "Plugin CakePHP 2.x Translator" < plugins/Translator/Vendor/Jenkins/jobs/build.xml
java -jar jenkins-cli.jar -s https://:8080 create-job "Plugin CakePHP 2.x Translator Qualité" < plugins/Translator/Vendor/Jenkins/jobs/quality.xml