1

我对 GetText 有疑问,我的问题实际上是:是否可以手动设置 .mo-filepath?

如果我在 shell 中键入“locales -a”,我会得到以下列表

C
de_DE.utf8
en_US.utf8
POSIX

我的 PHP 代码是这样的:

$directory = './locale';
$domain = 'texts';

$locale = 'fr_FR.utf8';

bindtextdomain($domain, $directory);
textdomain($domain);
bind_textdomain_codeset($domain, 'UTF-8');

putenv('LC_MESSAGES='.$locale);
setlocale(LC_MESSAGES, $locale);

如果我将变量 $locale 更改为“en_US”或“de_DE”并且文件可用,则它可以完美运行。但它不适用于不在上面列表中的语言环境。但是必须有一种方法可以在不安装每种语言的情况下做到这一点..

也许你知道一个好建议。先感谢您 ;)

4

3 回答 3

0

Zend 框架有自己的 gettext 实现,它实际上直接从 .mo 文件中读取,而不是使用 gettext 扩展名。

这可能是解决缺少系统语言环境的唯一方法

Zend_Translate Gettext 适配器不是使用 PHP 的 gettext 扩展实现的。即使您没有安装 PHP gettext 扩展,您也可以使用 Gettext 适配器。此外,适配器是线程安全的,PHP gettext 扩展目前不是线程安全的。

http://framework.zend.com/manual/1.12/en/zend.translate.adapter.html#zend.translate.adapter.gettext

来源 https://github.com/magento/magento2/blob/master/lib/Zend/Translate/Adapter/Gettext.php

于 2013-01-23T13:15:27.950 回答
0

如果您使用本机 gettext() 扩展,我认为这是不可能的。

您仍然可以通过$directory = './locale/fr_FR' and putting a folder在其中设置 LC_MESSAGE/en_US' 来做一个肮脏的解决方法。

您还可以使用用 PHP 编写的 PHP Gettext 仿真:https ://launchpad.net/php-gettext/即使没有安装语言环境也可以工作。

它还将防止另一个 gettext 警告:如果您更新 .mo 文件(上传新文件),如果它已经在其缓存中(每个进程都有自己的缓存),则本机 gettext 扩展将不会加载它。没有办法手动重新加载它(当然,除了更改字典名称......)。看看我前段时间问的一个问题:Gettext caching annoyance

于 2013-01-23T13:11:21.983 回答
0

这是前面提到的肮脏解决方法的解释:

如果我的语言环境文件夹如下所示:

locale
  fr_FR.UTF-8
  zh_CN.UTF-8

如果我知道我的代码将在其上运行的系统至少具有“en_US.UTF-8”语言环境,我可以使用该名称在每种语言下创建一个虚拟文件夹,其中包含 .po 或 .mo 文件:

locale
  fr_FR.UTF-8
    en_US.UTF-8
  zh_CN.UTF-8
    en_US.UTF-8

然后,我可以像这样设置我的语言环境

// Dynamically set your desired locale here 
$locale = 'fr_FR.UTF-8'

// Set locale to the same 'safe' locale every time
setlocale(LC_ALL, 'en_US.UTF-8');

// Call bindtextdomain with the directory containing the fake 'en_US.UTF-8' folder that is actually a different language
bindtextdomain('domain', BASE_DIR . DS . 'locale' . DS . $locale);
bind_textdomain_codeset('domain', 'UTF-8');
textdomain('domain');

有点hacky,但它就像一个魅力。

希望有人会为 bindtextdomain 添加更多选项,以便可以自定义它如何处理当前设置的语言环境

¯_(ツ)_/¯

于 2019-06-03T17:00:00.420 回答