philipp15b/php-i18n

PHP 简单的 i18n 类

v4.0.1 2018-03-26 12:50 UTC

This package is not auto-updated.

Last update: 2024-09-15 23:19:01 UTC


README

Latest Stable Version Build Status

这是一个简单的 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/
  • 保留语言区域变体:如果设置为 true,则将保留语言代码字符串(如 en-us 和 en-gb)中的区域变体,否则将裁剪为 en(默认:false
  • 如果没有用户语言可用时的回退语言(默认:en
  • 一个 '前缀',编译后的类名(默认 L
  • 如果你想强制一个语言(默认:无)
  • 部分分隔符:这用于在语言类中分隔部分。如果您将分隔符设置为 _abc_,则如果使用类别在 ini 中,您可以通过 L::category_abc_stringname 访问您的本地化字符串。(默认:_
  • 将回退语言的键合并到当前语言中
<?php
	$i18n->setCachePath('./tmp/cache');
	$i18n->setFilePath('./langfiles/lang/lang_{LANGUAGE}.ini'); // language file path
	$i18n->setLangVariantEnabled(false); // trim region variant in language codes (e.g. en-us -> en)
	$i18n->setFallbackLang('en');
	$i18n->setPrefix('I');
	$i18n->setForcedLang('en'); // force english, even if another user language is available
	$i18n->setSectionSeparator('_');
	$i18n->setMergeFallback(false); // make keys available from the fallback language
?>

简写

也有简写:您可以在构造函数中设置所有设置。

<?php
	$i18n = new i18n('lang/lang_{LANGUAGE}.ini', 'langcache/', 'en');
?>

(所有可选)参数包括

  1. 语言文件路径(ini 文件)
  2. 语言缓存路径
  3. 回退语言
  4. 前缀/编译后的类名

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 格式化。

此外,与最后两个例子一样,具有与类相同名称的辅助函数使得在需要时动态访问常量变得更加容易。

这就完成了!

用户语言检测的工作原理

此类尝试通过以下顺序尝试以下来源来检测用户的语言

  1. 强制语言(如果已设置)
  2. GET 参数 'lang'($_GET['lang']
  3. SESSION 参数 'lang'($_SESSION['lang']
  4. HTTP_ACCEPT_LANGUAGE(可以是多种语言)(《code>$_SERVER['HTTP_ACCEPT_LANGUAGE'])
  5. 回退语言

php-i18n 将删除以下字符之外的所有字符:A-Z、a-z 或 0-9 以防止 任意文件包含。之后,该类将搜索语言文件。例如,如果您将 GET 参数 'lang' 设置为 'en' 而没有设置强制语言,则该类将尝试找到文件 lang/lang_en.ini(如果设置 langFilePath 为默认值(《code>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 将 包含任意文件。默认实现是安全的。

分叉它!

贡献总是受欢迎的。