monbro / php-i18n
这是一个简单的PHP国际化类。没有花哨的功能,但速度快,因为它使用缓存且易于使用。带有composer包装器。
This package is not auto-updated.
Last update: 2024-09-24 07:36:49 UTC
README
这是一个简单的PHP国际化类。没有花哨的功能,但速度快,因为它使用缓存且易于使用。试试吧!
一些其功能
- 支持
.ini、.json或.yaml格式的翻译 - 文件缓存
- 简单的API(
L::category_stringname) - 内置对vprintf格式的支持(
L::name($par1)) - 自动确定使用哪种语言
- 简单;)
要求
- 缓存目录的写入权限
- PHP 5.2(仅测试此版本,也可能在其他版本上运行)
- PHP SPL扩展(默认已安装)
设置
要使用i18n类,请查看example.php。您将在该文件中找到一个关于此类的简单教程。否则,按照以下简单的五个步骤进行
1. 创建语言文件
要使用此类,您必须使用ini文件来存储翻译字符串。这可能看起来像这样
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. 如有必要,设置一些设置
可能的设置有
- 语言文件路径(ini文件)(默认:
./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('_'); ?>
简写
还有一个简写:您可以在构造函数中设置所有设置!
<?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' ?>
如您所见,您也可以将常量作为函数调用。它将以vprintf格式化。
就是这样!
它是如何确定用户语言的
这个类试图通过生成以下队列来找出用户语言:
- 强制语言(如果已设置)
- GET 参数 'lang'(
$_GET['lang']) - SESSION 参数 'lang'(
$_SESSION['lang']) - HTTP_ACCEPT_LANGUAGE(可以是多种语言)(
$_SERVER['HTTP_ACCEPT_LANGUAGE']) - 后备语言
首先它会移除重复元素,然后它会替换所有不是 A-Z、a-z 或 0-9 的字符。之后,它会搜索语言文件。例如,如果您将 GET 参数 'lang' 设置为 'en' 而没有设置强制语言,则该类将尝试查找文件 lang/lang_en.ini(如果设置 langFilePath 为默认值(lang/lang_{LANGUAGE}.ini))。如果该文件不存在,它将尝试查找会话中定义的语言的语言文件,依此类推。
如何更改此实现
您可以通过扩展 i18n 类来更改此 '算法'。您可以这样操作:
<?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(); // [...] ?>
这个对 i18n 类的非常基础的扩展替换了默认的 getUserLangs()-方法的实现,并且仅使用 GET 参数 'language' 和会话参数 'userlanguage'。您可以看到这个方法必须返回一个数组。
注意:此示例函数是不安全的:getUserLangs() 还必须转义结果,否则 i18n 将加载每个文件!
分叉它!
贡献总是受欢迎的。