翻译
Pagekit 支持显示不同语言的消息。这使得接口可以本地化支持任意数量的语言。
语言和地区之间存在差异,因为某个地区可能有不同版本的某种语言(例如)。en_GBen_US
语言文件
Pagekit 的核心包含语言文件。
/app/system/languages
/en_US
messages.php
formats.json
languages.json
territories.json
/de_DE
messages.php
formats.json
languages.json
territories.json
messages.pot
| 路径 | 描述 |
|---|---|
messages.pot |
这是包含所有可翻译字符串的主文件。作为基础制作本地化版本。由Pagekit维护者定期上传到Transifex。 |
/en_US/de_DE |
每个文件夹对应一个位置 |
xx_XX/formats.json |
本地化格式字符串 |
xx_XX/languages.json |
本地化语言名称 |
xx_XX/territories.json |
局部地区名称 |
格式、语言和地区由Unicode通用地方数据库定义。
翻译是从字符串的英文版本映射到本地化版本()。de_DE/messages.php
"No database connection." => "Keine Datenbankverbindung."
用途
要获得字符串的本地化版本,可以在PHP文件中使用全局函数。在Vue模板中,对字符串使用trans滤波器。__(...)
Pagekit 会自动检查当前的活动位置,并返回可用的字符串的本地化版本。
在PHP文件中:
echo __('Save');
在 Vue 模板中:
{{ 'Save' | trans }}
变量
假设你有一个名字存储在 中,想把它包含在一个局部字符串里。你可以把参数传递给平移函数,做简单的字符串替换。$name
$message = __("Hello %name%!", ["%name%" => $name]);
在 Vue 模板中,你可以把参数传递给过滤器。trans
{{ 'Installing %title%' | trans {title:pkg.title} }}
复数化
根据数字从多个消息中选择,你可以使用指定选项的语法,确定某些数字甚至区间。使用支持替换参数的函数。_c(...)
$message = _c('{0} No Item enabled.|{1} Item enabled.|]1,Inf[ Items enabled.', count($ids))
在Vue模板里你可以用过滤器。transChoice
{{ '{0} %count% Files|{1} %count% File|]1,Inf[ %count% Files' | transChoice count {count:count} }}
要指定匹配的数字,可以用括号内的数字,用标签让它更易读,或者用区间。这些变体也可以混合使用。{0}one:more:]1,Inf]
区间可以表示有限的数字集合:它可以表示两个数字之间的数字:, 。左侧分隔符可以是(包含)或(排他)。右侧分隔符可以是(exclusive)或(inclusive)。除了数字,你还可以使用和 ,表示无限。{1,2,3,4}[1, +Inf]]-1,2[[][]-Inf+Inf
为你的扩展创建语言文件
要翻译你自己的扩展,可以用命令行工具提取所有可翻译字符串。
./pagekit extension:translate pagekit/extension-hello
这样可以包含所有已找到的字符串。这些是通过查找Vue组件中对翻译函数 和过滤器的所有调用来收集的。/packages/pagekit/extensions-hello/languages/messages.pot__()_c()transtranschoice
然而,当你动态确定消息时,字符串的自动检测将失败。命令失败的例子包括:
<?php
// string cannot be detected: no string literal used
echo __($message);
// string cannot be detected: Use format string instead
echo __('Hello' + $name);
// string literal without using translation filter
UIkit.notify('Item deleted');
有时,你无法避免这些情况,因为你必须在运行时动态确定字符串。解决这个问题的建议方法是在扩展中找到一个包含translate命令能找到的所有字符串的文件。languages/messages.php
<?php
__('Message One');
__('Message Two');
_c('{0} %count% Files|one: File|more %count% File', 0);
有了创建的,你现在可以为你的扩展创建翻译。你可以用像poEdit这样的工具手动创建翻译,也可以用Transifex。messages.pot
完成的翻译文件必须位于你扩展名的文件夹中,即在 。languageslanguages/de_DE/
地点的确定方式
运行安装程序时,会手动选择所在地。之后可以在Pagekit管理面板(系统/本地化)中更改。你可以为前端和管理面板设置不同的位置。
你只能选择系统扩展中可用的语言。
与消息域的工作
/ 函数和 / 过滤器还有第三个参数来设置域。默认域名叫做 ,这也是我们到目前为止处理文件的原因。所有扩展在此域中共享字符串。这就是为什么系统扩展翻译的字符串可以立即使用,无需再次翻译。这包括常见的术语,比如保存、错误或月份名称。__(...)_c(...)transtransChoicemessagesmessages.*
事实上,当我们之前打电话时,结果中没有包含系统的任何消息,即使它们出现在Hello扩展中。./pagekit extension:translate hellomessages.pot
有时你不想分享默认域名的消息。只需设置自己的域名并重新生成文件即可。你可以对单个字符串这样做,或者在所有字符串上设置参数,这样可以让你的本地化与系统完全分离。*.pot
$msg = __("Hello Universe", [], "hello");