ne0bot / php-i18n
PHP的简单国际化类
This package is not auto-updated.
Last update: 2024-09-29 05:01:29 UTC
README
这是一个简单的PHP国际化类。没有花哨的功能,但速度快,因为它使用了缓存,并且易于使用。试试看吧!
其部分特性
- 支持
.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']
) - SESSION 参数 '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 将 包含任意文件。默认实现是安全的。
分叉它!
欢迎贡献。