libriciel/cakephp-translator

CakePHP 2.x 插件,用于简化跨多个域的翻译

安装: 39

依赖项: 1

建议者: 0

安全: 0

类型:cakephp-plugin

2.0.0 2024-01-22 14:41 UTC

This package is auto-updated.

Last update: 2024-09-25 17:16:43 UTC


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

此文件包含对控制器 recipesview 页面的翻译,用于我的另一位法语客户,其标识为 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