jeriveromartinez / php-i18n
PHP 简单的 i18n 类
This package is not auto-updated.
Last update: 2024-09-15 04:10:45 UTC
README
这是一个简单的 PHP i18n 类。没有花哨的功能,但速度快,因为它使用了缓存,并且易于使用。试试吧!
一些其功能
- 在
.ini/.properties、.json或.yaml格式中的翻译字符串 - 缓存
- 简单的 API:
L::category_stringname - 内置对 vsprintf 格式的支持:
L::name($par1) - 自动用户语言检测
- 简单;)
要求
- 缓存目录的写入权限
- PHP 5.2 及以上
- PHP SPL 扩展(默认安装)
设置
在 example.php 文件中有一个可用的示例。您只需遵循以下简单的五个步骤
1. 创建语言文件
要使用此类,您需要创建包含翻译字符串的翻译文件。它们可以是 .ini/.properties、.json 或 .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'。
2. 包含类
<?php require_once 'i18n.class.php'; ?>
3. 初始化类
<?php $i18n = new i18n(); ?>
4. 如有必要,设置一些设置
可能的设置包括
- 语言文件路径(默认:
./lang/lang_{LANGUAGE}.ini) - 缓存文件路径(默认:
./langcache/) - 如果没有用户语言可用时的后备语言(默认:
en) - 前缀,编译后的类名(默认
L) - 如果您想强制一个语言(默认:无)
- 部分分隔符:用于在语言类中分隔部分。如果您将分隔符设置为
_abc_,则如果您在 ini 中使用类别,则可以通过L::category_abc_stringname访问本地化字符串。 (默认:_) - 将后备语言中的键合并到当前语言中
<?php $i18n->setCachePath('./tmp/cache'); $i18n->setFilePath('./langfiles/lang/lang_{LANGUAGE}.ini'); // language file path $i18n->setFallbackLang('en'); $i18n->setPrefix('I'); $i18n->setForcedLang('en') // force english, even if another user language is available $i18n->setSectionSeperator('_'); $i18n->setMergeFallback(false); // make keys available from the fallback language ?>
简写
还有简写:您可以在构造函数中设置所有设置。
<?php $i18n = new i18n('lang/lang_{LANGUAGE}.ini', 'langcache/', 'en'); ?>
(所有都是可选的)参数包括
- 语言文件路径(ini 文件)
- 语言缓存路径
- 后备语言
- 前缀/编译后的类名
5. 调用 init() 方法以加载所有文件和翻译
调用 init() 文件以指示类加载适当的语言文件,加载缓存文件或如果不存在则生成它,并使 L 类可用,以便您可以访问本地化。
<?php $i18n->init(); ?>
6. 使用本地化
要调用您的本地化,只需使用 L 类和字符串的类常量。
在这个例子中,我们使用第 1 步中看到的翻译字符串。
<?php 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']) - 会话参数 'lang' (
$_SESSION['lang']) - HTTP_ACCEPT_LANGUAGE (可以支持多种语言) (
$_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() 方法来更改用户检测
<?php 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 会 包含任意文件。默认实现是安全的。
分叉它!
贡献总是受欢迎的。