surcoufx83 / php-i18n
PHP 的简单国际化类
Requires
- php: >= 7.1
- mustangostang/spyc: 0.6.2
- phpunit/phpunit: ^8.5
README
这是一个简单的 PHP 国际化类,由 Philipp15b/php-i18n 分支而来。没有太多花哨的功能,但速度很快,因为它使用了缓存,并且易于使用。试试吧!
它的某些特性
- 支持
.ini
/.properties
、.json
或.yaml
格式的翻译字符串 - 缓存
- 简单的 API:
L::category_stringname
- 内置对 vsprintf 格式的支持:
L::name($par1)
- 自动检测用户语言
- 简单;)
要求
- 缓存目录的写入权限
- PHP 7.1 及以上版本
- PHP SPL 扩展(默认已安装)
设置
在 example-ini.php
和 example-yml.php
文件中有示例。你只需按照以下步骤操作
1. 加载源代码
你可以通过下载单个文件(i18n.class.php
是唯一的要求)或运行 composer 来获取此项目的源代码
composer require surcoufx83/php-i18n
2. 创建语言文件
要使用此类,你需要创建包含翻译字符串的翻译文件。它们可以是 .ini
/.properties
、.json
或 .yml
/.yaml
文件。这可以看起来像这样
lang_en.ini
(英文)
greeting = "Hello World!"
[category]
somethingother = "Something other..."
lang_de.ini
(德文)
greeting = "Hallo Welt!"
[category]
somethingother = "Etwas anderes..."
将这两个文件保存在你将在第 4 步设置的目录中。文件必须按照 filePath 设置的名称命名,其中 '{LANGUAGE}' 将被用户的语言(如 'en' 或 'de')替换。更多示例请参阅此存储库的 lang 文件夹。
3. 包含并初始化类
<?php
use I18N\i18n;
use I18N\L;
require_once 'vendor/surcoufx83/php-i18n/i18n.class.php';
$i18n = new i18n();
?>
4. 如有必要,设置一些设置
可能的设置包括
- 语言文件路径(默认:
./lang/lang_{LANGUAGE}.yml
) - 缓存文件路径(默认:
./langcache/
) - 如果没有用户语言可用时的回退语言(默认:
en
) - 一个 'prefix',编译后的类名(默认
L
) - 如果需要强制语言,则强制语言(默认:无)
- 部分分隔符:用于在语言类中分隔部分。如果您将分隔符设置为
_abc_
,则可以使用L::category_abc_stringname
访问本地化字符串,如果您在 ini 中使用类别。(默认:_
) - 将回退语言中的键合并到当前语言中
...
$i18n = new i18n();
$i18n->setCachePath('./tmp/cache');
$i18n->setFilePath('./langfiles/lang/lang_{LANGUAGE}.ini'); // language file path
$i18n->setFallbackLang('en');
$i18n->setPrefix('lang');
$i18n->setForcedLang('en'); // force english, even if another user language is available
$i18n->setSectionSeparator('_');
$i18n->setMergeFallback(false); // make keys available from the fallback language
也可以使用链式方法来设置
...
$i18n = new i18n();
$i18n->setCachePath('./tmp/cache')
->setFilePath('./langfiles/lang/lang_{LANGUAGE}.ini')
->setFallbackLang('en')
->setPrefix('lang')
->setForcedLang('en')
->setSectionSeparator('_')
->setMergeFallback(false);
...
简写
还有一个简写:你可以在构造函数中设置所有设置。
...
$i18n = new i18n('lang/lang_{LANGUAGE}.ini', 'langcache/', 'en');
...
(所有可选)参数包括
- 语言文件路径(ini 文件)
- 语言缓存路径
- 回退语言
- 前缀/编译后的类名
5. 调用 init()
方法加载所有文件和翻译
调用 init()
文件指示类加载适当的语言文件,加载缓存文件或如果不存在则生成它,并使 L
类可用,以便您可以通过它访问本地化。
...
$i18n->init();
...
6. 使用本地化
要调用本地化,只需使用 L
类和一个类常量即可。
在这个例子中,我们使用了第 1 步中看到的翻译字符串。
...
echo L::greeting;
// If 'en' is applied: 'Hello World'
echo L::category_somethingother;
// If 'en' is applied: 'Something other...'
echo L::last_modified("today");
// Could be: 'Last modified: today'
echo L($string);
// Outputs a dynamically chosen static property
echo L($string, $args);
// Same as L::last_modified("today");
...
如您所见,您还可以将常量作为函数调用。它将以 vsprintf 格式化。
此外,就像前两个例子一样,一个与类名相同的辅助函数使得动态访问常量变得更加容易。
这就完了!
用户语言检测是如何工作的
这个类试图按照以下顺序尝试以下来源来检测用户的语言:
- 强制语言(如果已设置)
- GET 参数 'lang'(
$_GET['lang']
) - SESSION 参数 'lang'(
$_SESSION['lang']
) - HTTP_ACCEPT_LANGUAGE(可以是多种语言)(《code>$_SERVER['HTTP_ACCEPT_LANGUAGE'])
- 回退语言
php-i18n 会删除所有不是以下字符的字符:A-Z、a-z 或 0-9,以防止 任意文件包含。之后,该类将搜索语言文件。例如,如果您设置了 GET 参数 'lang' 为 'en' 而没有强制设置语言,则该类会尝试找到文件 lang/lang_en.ini
(如果将 langFilePath
设置为默认值(lang/lang_{LANGUAGE}.ini
))。如果此文件不存在,php-i18n 将尝试找到会话变量中定义的语言的语言文件,依此类推。
如何更改此实现
您可以通过扩展 i18n
类并重写 getUserLangs()
方法来更改用户检测
require_once 'i18n.class.php';
class My_i18n extends i18n {
public function getUserLangs() {
$userLangs = new array();
$userLangs[] = $_GET['language'];
$userLangs[] = $_SESSION['userlanguage'];
return $userLangs;
}
}
$i18n = new My_i18n();
// [...]
这个非常基础的扩展只使用了 GET 参数 'language' 和会话参数 'userlanguage'。您可以看到,这个方法必须返回一个数组。
注意:此示例函数不安全: getUserLangs()
还必须转义结果,否则 i18n 将 包含任意文件。默认实现是安全的。
分叉它!
贡献总是受欢迎的。