mindplay / lang
超简单,超级轻量级的本地化工具
Requires
- php: >=5.4.0
- mindplay/composer-locator: ^2
Requires (Dev)
- mindplay/testies: dev-master
- phpunit/php-code-coverage: >=2, <4
This package is auto-updated.
Last update: 2024-08-25 19:37:26 UTC
README
此库实现了一个超简单、超级轻量级的本地化工具。(~100 SLOC)
它由一个伪命名空间和一些函数组成,但提供了令人惊讶的灵活性,包括处理复数的能力,如“1 个结果”与“5 个结果”,而不需要发明任何专有语法。
概念
字符串从英文源文本翻译,可选地用名称/值标记替换。
或者,您可以使用键而不是英文源文本,例如 NUM_RESULTS
而不是 {num} results
- 这纯粹是惯例问题,并不影响翻译机制的工作,您只需了解每种策略的优缺点即可。
-
使用英文源文本,您得到的代码更易读,并且可能根本不需要任何英文语言文件 - 缺点是即使是对英文源文本的微小更改(大小写,标点符号)也会要求在所有翻译文件中更新源文本。(另一方面,您也可以将其视为优点,即对源文本的任何更改都要求更新翻译,迫使您保持翻译更新。)
-
使用键,您的源代码可能不那么易读,但更健壮 - 英文源文本的微小更改不会影响任何内容。但是,使用这种方法,您必须与您的项目或软件包一起提供一组英文语言文件。(同样,您也可以将其视为优点,即英文源文件为翻译人员提供了一个参考来源。)
翻译被分组到“翻译域”中,这些域映射到子文件夹和平面 PHP 文件,例如每个域/语言对一个文件。
按照惯例,您的基准翻译域应该是您的 Composer 软件包名称,例如 {vendor}/{package}
,可选地在这些下面嵌套翻译子域 - 遵循此惯例消除了在根目录中放置名为 lang
的文件夹时需要使用 lang::register()
启动程序的需求。
整个系统是 静态
的,如果这让您感到不舒服 - 请放松。毕竟,翻译是全局的,即对于任何给定语言,每个字符串只有一个翻译。
用法
要翻译一个字符串,只需这样做
use mindplay\lang; echo lang::text("foo/bar", "Hello {who}", ["who" => "World"]); // => "Hello World"
默认情况下(没有任何配置;见下文),此库将加载文件 vendor/foo/bar/en.php
- 语言文件格式将在下文讨论。
要更改活动语言,请这样做
lang::set("en");
要获取特定语言的字符串(忽略活动语言),请使用 translate()
函数
$text = lang::translate("en", "foo/bar", "...");
或者,您可以获取特定语言域的翻译函数,并重用它
$t = lang::domain("foo/bar"); echo $t("Hello {who}", ["who" => "World"]); // => "Hello World" echo $t("Hi {who}", ["who" => "World"]); // => "Hi World"
这可以用于依赖注入,或者只是避免在每个调用中重复语言域名称。请注意,可选的第二参数语言代码将为您提供特定语言的翻译函数。请注意,语言文件实际上只有在使用翻译函数时才会加载 - 因此没有不可预测的性能影响。
假设您遵循使用您的Composer包名作为根语言域的约定,并将语言文件放在包根目录下名为 lang
的文件夹中,您无需调用 lang::register()
来配置根路径——包将使用 composer-locator 来自动查找根路径。
在其他情况下——或者在某些您希望覆盖项目外部包翻译文件的情况下——您需要为语言域注册翻译文件的基路径——例如
lang::register("foo/bar", __DIR__ . "/lang");
现在,如果您调用 lang::text("foo/bar", "...")
,则将加载翻译文件 {__DIR__}/lang/en.php
——文件名是两位字母的语言代码。如果您调用 lang::text("foo/bar/baz", "...")
,则将加载翻译文件 {__DIR__}/lang/baz/en.php
,依此类推。
例如,一个如 lang/baz/en.php
的语言文件可能看起来像这样
<?php return [ 'Hello, {world}' => 'Greetings, {world}', '{num} results' => function ($num) { return $num != 1 ? "{$num} results" : "{$num} result"; } ];
此示例演示了两种翻译形式——使用带花括号占位符的普通字符串或使用匿名函数;在后一种情况下,标记与匹配的参数名称映射,这允许您为诸如复数之类的特定语言逻辑实现语言特定逻辑。
有关更多信息,请参阅 内联文档。