gpt4 book ai didi

php - 如何国际化 PHP 第三方库

转载 作者:可可西里 更新时间:2023-10-31 22:13:11 27 4
gpt4 key购买 nike

考虑编写一个 PHP 库,它将通过 Packagist 或 Pear 发布。它面向在任意设置中使用它的同行开发人员。

这个库将包含一些为客户端确定的状态消息。我如何国际化此代码,以便使用该库的开发人员可以尽可能自由地插入他们自己的本地化方法?我不想假设任何事情,尤其是不想强制开发人员使用 gettext。

为了研究一个例子,让我们上这门课:

class Example {

protected $message = "I'd like to be translated in your client's language.";

public function callMe() {
return $this->message;
}

public function callMeToo($user) {
return sprintf('Hi %s, nice to meet you!', $user);
}

}

这里有两个问题:如何标记要翻译的私有(private) $message,以及如何允许开发人员本地化 callMeToo() 中的字符串?

一个(非常不方便的)选项是,在构造函数中请求一些 i18n 方法,如下所示:

public function __construct($i18n) {
$this->i18n = $i18n;
$this->message = $this->i18n($this->message);
}

public function callMeToo($user) {
return sprintf($this->i18n('Hi %s, nice to meet you!'), $user);
}

但我非常希望有一个更优雅的解决方案。

编辑 1: 除了简单的字符串替换之外,i18n 的领域很广泛。前提是,我不想将任何 i18n 解决方案打包到我的库中,也不想强制用户专门选择一个来满足我的代码需求。

那么,我该如何构建我的代码,以便为不同方面提供最佳和最灵活的本地化:字符串翻译、数字和货币格式、日期和时间……?假设一个或另一个显示为我的图书馆的输出。消费开发者可以在哪个位置或界面插入她的本地化解决方案?

最佳答案

最常用的解决方案是字符串文件。例如。像下面这样:

# library
class Foo {
public function __construct($lang = 'en') {
$this->strings = require('path/to/langfile.' . $lang . '.php');
$this->message = $this->strings['callMeToo'];
}

public function callMeToo($user) {
return sprintf($this->strings['callMeToo'], $user);
}
}

# strings file
return Array(
'callMeToo' => 'Hi %s, nice to meet you!'
);

为了避免 $this->message 赋值,您还可以使用魔法 setter/getter :

# library again
class Foo {
# … code from above

function __get($name) {
if(!empty($this->strings[$name])) {
return $this->strings[$name];
}

return null;
}
}

您甚至可以添加一个 loadStrings 方法,该方法从用户那里获取一个字符串数组并将其与您的内部字符串表合并。

编辑 1:为了获得更大的灵 active ,我会稍微更改上述方法。我会添加一个翻译函数作为对象属性,并在我想本地化一个字符串时总是调用它。默认函数只是在字符串表中查找字符串,如果找不到本地化的字符串,则返回值本身,就像 gettext 一样。使用您的库的开发人员随后可以将函数更改为他自己提供的函数,以执行完全不同的本地化方法。

日期本地化不是问题。设置区域设置取决于您的库所使用的软件。格式本身是本地化的字符串,例如$this->translate('%Y-%m-%d') 将返回日期格式字符串的本地化版本。

数字本地化是通过设置正确的语言环境并使用像 sprintf() 这样的函数来完成的。

不过,货币本地化是个问题。我认为最好的方法是添加一个货币转换函数(并且,也许为了更好的灵 active ,还有另一个数字格式化函数),如果开发人员想要更改货币格式,他可以覆盖它。或者,您也可以为货币实现格式字符串。例如 %CUR %.02f – 在此示例中,您将用货币符号替换 %CUR。货币符号本身也是本地化字符串。

编辑 2:如果你不想使用 setlocale 你必须做很多工作......基本上你必须重写 strftime() sprintf() 实现本地化的日期和数字。当然可能,但需要大量工作。

关于php - 如何国际化 PHP 第三方库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20503567/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com