跳至主要内容

翻译

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");