这是php手册中的一小段代码片段:
putenv('LC_ALL=zh_CN');
setlocale(LC_ALL, 'zh_CN');
bindtextdomain('domain', './locale');
textdomain('domain');
echo gettext('Hello');
Run Code Online (Sandbox Code Playgroud)
哪个会输出你在domain.mo文件中定义的,但问题是只要Apache正在运行,gettext()总是返回缓存的结果.
如果我改变的翻译你好到您好的domain.mo,它仍将输出你好.
但是,通过更改和新名称的domain参数可以解决此问题.像到.但是每次更新文件时编辑php文件真的很痛苦.bindtextdomain()textdomain()"domain""domain2".mo
有没有更好的方法来做这个,比如删除一些文件夹或调用一些PHP函数来完成这项工作?这样我就可以为此编写一个小脚本.
在线编辑gettext文件,有可能吗?
我对我所有的PHP项目使用gettext,但是有一个小问题的方面,想要我的用户可能会将我的语言从丹麦语翻译成挪威语,但是在这种情况下它是enste我知道是我需要从Poedit导出我的文件有任何.其他可以导出/导入我的文件的软件?对于Poedit我可以用export作为.
希望我能帮助我一点.
以下示例适用于使用Apache的Mac OS X,即我将已翻译的字符串回显.但是在使用lighttpd的Ubuntu上,我得到原始文本"非活动帐户".我已经尝试了各种各样的环境varialbes组合而没有任何运气.它不是文件权限,因为我可以回显.mo文件的内容.
<?php
//$locale = 'sv_SE.UTF-8';
$locale = 'sv_SE';
$dir = dirname(__FILE__);
// File permission is apparantly not a problem as this works...
//echo file_get_contents($dir . '/sv_SE/LC_MESSAGES/flattr.mo');
putenv("LANG=$locale");
putenv("LANGUAGE=$locale");
putenv("LC_ALL=$locale");
putenv("LC_MESSAGES=$locale");
setlocale(LC_ALL, $locale);
setlocale(LC_MESSAGES, $locale);
//setlocale(LANG, $locale);
//setlocale(LANGUAGE, $locale);
bindtextdomain('flattr', $dir);
//bind_textdomain_codeset("flattr", 'UTF-8');
textdomain('flattr');
echo _("Inactive account");
?>
Run Code Online (Sandbox Code Playgroud)
有人有主意吗?
我一直在寻找开源项目国际化的选择:
每个人似乎都推荐的Gettext显然需要将"语言环境"安装在"系统上"才能使用.请参阅PHP手册中的这个注释,它反映了我的具体情况.这个问题也提出了同样的问题.这不适合开源项目,因为我不相信最终用户在他们的系统上安装了适当的语言环境.此外,您必须安装区域设置才能使用已翻译的字符串(IMO),这非常奇怪.
Zend_Translate有时也推荐使用gettext,但我没有使用Zend框架,因此我认为这不是我的选择.有些人说你可以从Zend框架中拆分它,但我不知道如何.如果有人能告诉我需要哪些文件(我已经下载了Zend框架的tarball)来挑选,我会愿意使用Zend_Translate.
阵列.这就是我现在正在做的事情,但它并不理想,因为:
我可以以某种方式读取.mo没有Gettext或Zend_Translate的文件,还是我必须使用Gettext?如果是这样,我如何使所有语言环境都能正常工作,就像我上面链接的问题一样?
编辑:我现在愿意使用Zend_Translate.我只需要弄清楚我需要哪些文件(如果将它们合并到一个文件中会很棒) - 我不希望在我的项目中使用整个Zend Framework.
更新:我有兴趣看看有多大的开源项目处理i18n:
setlocale('C')以获得通用语言环境并避开整个setlocale混乱.因此,就我所见,这三个随机项目中没有一个使用Zend_Translate,也没有直接使用gettext.
也许使用C语言环境是个好主意,在文本域名中存储语言名称,然后从那里开始.
所以这就是我所拥有的:
$lang = 'de'; //debug
setlocale( LC_ALL, 'C' );
bindtextdomain( 'default', PATH . "/locale/$lang" );
bind_textdomain_codeset( 'default', 'UTF-8' );
textdomain( 'default' );
var_dump( file_exists( PATH . "/locale/$lang/C/LC_MESSAGES/default.mo" ) ); //bool(true)
Run Code Online (Sandbox Code Playgroud)
但我仍然只是得到英文字符串,即使我已经使用poedit,msgfmt等来制作相应的文件.我也试过重启Apache.
考虑编写一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
这里有两个问题:如何将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);
}
Run Code Online (Sandbox Code Playgroud)
但我非常希望有一个更优雅的解决方案.
编辑1:除了简单的字符串替换外,i18n的字段很宽.前提是,我不想在我的库中打包任何i18n解决方案,或强迫用户专门选择一个以满足我的代码.
然后,我如何构建我的代码,以便为不同方面提供最佳和最灵活的本地化:字符串翻译,数字和货币格式,日期和时间,......?假设一个或另一个显示为我的库的输出.消费者可以在哪个位置或界面插入她的本地化解决方案?
我一直在学习一些gettext但我无法掌握这两个功能.我一直想知道我是否可以在用PHP编写的APP中使用多个翻译.例如,我1)系统翻译2)扩展翻译3)主题翻译,以划分不同的文件.我的问题是,如果我加载系统翻译,然后加载主题翻译将第一个"未设置"?
我很感激任何与gettext和php相关的链接.
谢谢
我目前正在开发一个需要提供法语和英语的PHP Web应用程序.我环顾四周,发现Gettext()功能提供了最佳性能.
我用命令生成了我的.pot文件
xgettext PhpFileToTranslate.php -o NameOfTemplateFile.pot
Run Code Online (Sandbox Code Playgroud)
并成功生成了一个.pot文件.我使用PoEdit生成messages.po文件并创建了messages.mo
这是我的服务器文件:
/app
/locale
/en_US
/LC_MESSAGES
messages.po
messages.mo
/fr_FR
/LC_MESSAGES
messages.po
messages.mo
template.pot
Run Code Online (Sandbox Code Playgroud)
我在php文件中设置语言环境,如下所示:
$language = $_SESSION['language']; //session contains 'fr_FR.UTF-8' or 'en_US.UTF-8'
setlocale(LC_ALL, $language);
bindtextdomain('messages', './locale');
textdomain('messages');
Run Code Online (Sandbox Code Playgroud)
但我只看到标签,而不是翻译......我试着把'fr_FR'代替'fr_FR.UTF-8'和所有种类的字符串,但它不起作用.
我错过了什么吗?我的服务器是带Apache和php5的Ubuntu 12.04服务器
我在一个文件夹中有.po和.mo文件,其地址是/ locale/nld_nld/LC_MESSAGES /.这两个文件的名称都是消息.我一直在尝试使用以下代码:
try.php:
<?php
require_once("Localization.php");
echo _("Hello World!");
?>
Run Code Online (Sandbox Code Playgroud)
Localization.php在这里:
<?php
$locale = "nld_nld";
if (isSet($_GET["locale"])) $locale = $_GET["locale"];
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("messages", "./locale");
bind_textdomain_codeset("messages", 'UTF-8');
textdomain("messages");
?>
Run Code Online (Sandbox Code Playgroud)
try.php和Localization文件都在同一目录中.另外,我用xampp.我也实施了phpinfo();.在表格中,在"GetText支持"前面,提到了启用.该messages.po和messages.mo文件是我使用poEdit的创建有效文件.我是一个Windows用户.但是,当我打开try.php时,它只是回显了Hello World!(不是它的翻译字符串.另外,我已经将.po文件100%翻译(根据poEdit).但是,我没有得到结果.对此有点帮助将不胜感激.
提前致谢!
我使用PHP Gettext扩展来本地化Web应用程序.当你这样做时:
bindtextdomain("example", "/locales");
Run Code Online (Sandbox Code Playgroud)
如果您将语言环境设置为fr_FR,它将在以下位置查找MO:
/locales/fr_FR/LC_MESSAGES/example.mo
Run Code Online (Sandbox Code Playgroud)
有没有办法自定义该路径?例如,我想使用以下结构:
/locales/example.fr_FR.mo
Run Code Online (Sandbox Code Playgroud) 我正在使用gettext PHP函数编写简单的脚本.一切都运作良好,但我试图monitore什么改变了什么.
例如,当用户更改2个字段时
Type: (old) Agreement (new) Anex
Notes: (old) #empty field# (new) Agreement ID: 123
Run Code Online (Sandbox Code Playgroud)
我的editinfo生成器看起来像那样
foreach($checkArray as $row => $value)
{
if ($addData[$row] != $checkArray[$row])
{
$editInfo .= ' <b>' . _("FILED") . '</b> ' . _("$row") . ' <b>' . _("CHANGED FROM") . '</b> ' . _($checkArray[$row]) . ' <b>' . _("FOR") . '</b> ' . _($addData[$row]) . '<br />';
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到了这样的信息
<b>POLE</b> Type <b>ZMIENIONE Z</b> Umowa <b>NA</b> Aneks <br />
<b>POLE</b> Notes <b>ZMIENIONE Z</b> Project-Id-Version: …Run Code Online (Sandbox Code Playgroud)