标签: php-gettext

如何在不重启Apache的情况下清除php的gettext缓存,也不更改域名?

这是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函数来完成这项工作?这样我就可以为此编写一个小脚本.

php gettext php-gettext

20
推荐指数
3
解决办法
2万
查看次数

在线编辑gettext文件?

在线编辑gettext文件,有可能吗?

我对我所有的PHP项目使用gettext,但是有一个小问题的方面,想要我的用户可能会将我的语言从丹麦语翻译成挪威语,但是在这种情况下它是enste我知道是我需要从Poedit导出我的文件有任何.其他可以导出/导入我的文件的软件?对于Poedit我可以用export作为.

希望我能帮助我一点.

php gettext php-gettext

19
推荐指数
2
解决办法
6488
查看次数

无法在Ubuntu上运行gettext(php)

以下示例适用于使用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)

有人有主意吗?

php ubuntu gettext php-gettext

15
推荐指数
1
解决办法
2万
查看次数

使用PHP Gettext而无需安装区域设置

我一直在寻找开源项目国际化的选择:

  • 每个人似乎都推荐的Gettext显然需要将"语言环境"安装在"系统上"才能使用.请参阅PHP手册中的这个注释,它反映了我的具体情况.这个问题也提出了同样的问题.这不适合开源项目,因为我不相信最终用户在他们的系统上安装了适当的语言环境.此外,您必须安装区域设置才能使用已翻译的字符串(IMO),这非常奇怪.

  • Zend_Translate有时也推荐使用gettext,但我没有使用Zend框架,因此我认为这不是我的选择.有些人说你可以从Zend框架中拆分它,但我不知道如何.如果有人能告诉我需要哪些文件(我已经下载了Zend框架的tarball)来挑选,我会愿意使用Zend_Translate.

  • 阵列.这就是我现在正在做的事情,但它并不理想,因为:

    • 当大多数翻译不被当前页面使用时,它将占用大量内存来定义每个翻译.
    • 我发现自己复制数组中的密钥有问题,这已经变成了1000行代码,而我几乎没有添加任何东西......
    • 这意味着非程序员无法真正翻译,而POedit是每个人都希望使用的标准.

我可以以某种方式读取.mo没有Gettext或Zend_Translate的文件,还是我必须使用Gettext?如果是这样,我如何使所有语言环境都能正常工作,就像我上面链接的问题一样?

编辑:我现在愿意使用Zend_Translate.我只需要弄清楚我需要哪些文件(如果将它们合并到一个文件中会很棒) - 我不希望在我的项目中使用整个Zend Framework.


更新:我有兴趣看看有多大的开源项目处理i18n:

因此,就我所见,这三个随机项目中没有一个使用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 arrays gettext zend-translate php-gettext

12
推荐指数
1
解决办法
4091
查看次数

如何国际化PHP第三方库

考虑编写一个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解决方案,或强迫用户专门选择一个以满足我的代码.

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

php localization internationalization php-gettext

11
推荐指数
1
解决办法
1160
查看次数

什么是gettext中的bindtextdomain,textdomain?

我一直在学习一些gettext但我无法掌握这两个功能.我一直想知道我是否可以在用PHP编写的APP中使用多个翻译.例如,我1)系统翻译2)扩展翻译3)主题翻译,以划分不同的文件.我的问题是,如果我加载系统翻译,然后加载主题翻译将第一个"未设置"?

我很感激任何与gettext和php相关的链接.

谢谢

php gettext php-gettext

6
推荐指数
1
解决办法
1万
查看次数

使用Gettext()进行PHP Web应用程序国际化;

我目前正在开发一个需要提供法语和英语的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服务器

php ubuntu-server php-gettext

6
推荐指数
1
解决办法
1025
查看次数

如何使用PHP的po/pot文件?

我在一个文件夹中有.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.pomessages.mo文件是我使用poEdit的创建有效文件.我是一个Windows用户.但是,当我打开try.php时,它只是回显了Hello World!(不是它的翻译字符串.另外,我已经将.po文件100%翻译(根据poEdit).但是,我没有得到结果.对此有点帮助将不胜感激.

提前致谢!

php gettext mo php-gettext po

5
推荐指数
1
解决办法
6663
查看次数

PHP Gettext:如何在设置域的路径后更改默认的MO路径?

我使用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)

php gettext php-gettext

5
推荐指数
1
解决办法
2273
查看次数

如何在php中隐藏gettext信息

我正在使用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)

php gettext php-gettext

5
推荐指数
1
解决办法
49
查看次数