monbro / php-i18n

此包的最新版本(dev-master)没有可用的许可信息。

这是一个简单的PHP国际化类。没有花哨的功能,但速度快,因为它使用缓存且易于使用。带有composer包装器。

维护者

详细信息

github.com/monbro/php-i18n

源代码

安装: 34

依赖: 0

建议: 0

安全: 0

星级: 0

关注者: 3

分支: 112

dev-master 2014-10-08 15:18 UTC

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');
?>

(可选)参数包括

  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'
?>

如您所见,您也可以将常量作为函数调用。它将以vprintf格式化。

就是这样!

它是如何确定用户语言的

这个类试图通过生成以下队列来找出用户语言:

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

首先它会移除重复元素,然后它会替换所有不是 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 将加载每个文件!

分叉它!

贡献总是受欢迎的。