CakePHP插件本地化在不同的文件中

时间:2017-07-03 14:29:51

标签: cakephp localization cakephp-3.0

我为我的cakephp(3.2)应用程序制作了ContentManager插件。它在/plugins/ContentManager/src/Locale/ru/content_manager.po

中有基本翻译文件

现在我想在应用程序级别添加一些附加翻译。所以我需要为我的插件添加一些额外的po文件。如果我在content_manager.po文件夹中再放一个app\src\Locale\ru文件,它会覆盖基本文件。

是否可以添加content_manager.0.po, content_manager.base.po之类的文件,并让它们一起工作?无论如何,我需要以某种方式扩展插件转换。

基本文件包含类似这些的字符串

msgid "tab_MenuItems"
msgid "content.type.News"
msgid "users.role.admin"

等等。
附加文件包含特定于应用程序的字符串,如:

msgid "content.type.Products"
msgid "content.type.Orders"
msgid "users.role.manager"

插件本身使用像(示例smarty)这样的翻译:

{foreach $registered_types as $ct}
<li>{__d("content_manager", "content.type.$ct")}</li>
{/foreach}

1 个答案:

答案 0 :(得分:1)

您可以在应用The N'text'区域设置文件夹中添加default.po文件,默认情况下,此文件将由所谓的&#34;后备加载程序&#34;使用,这将是如果在主域中找不到请求的消息ID,即在ru

中使用

如果您需要更多控制,您可以随时构建自定义加载器/包,例如:

content_manager.po

这将创建一个内部预加载默认use Cake\I18n\I18n; use Cake\I18n\MessagesFileLoader; I18n::config('content_manager', function ($name, $locale) { $fileLoader = new MessagesFileLoader('content_manager', $locale, 'po'); /* @var $package \Aura\Intl\Package */ $package = $fileLoader(); $package->setFallback('content_manager.base'); return $package; }); 域消息的加载器,并将回退加载器域设置为content_manager,以便它尝试从{{1}加载消息文件,以防默认域中没有翻译。

在添加/修改翻译/加载器后,不要忘记清除缓存(content_manager.base)。

另见