【问题标题】:PHP and Gettext don't work on my serverPHP 和 Gettext 在我的服务器上不起作用
【发布时间】:2010-05-26 16:49:57
【问题描述】:

我有一个网站。我正在尝试让 gettext 工作,以便我的英语、瑞典和挪威网站可以出现。我无法让它工作。我做错了什么?

这是我的配置代码:

// define constants ( defualt - danish )
$lang = 'da_DA';
$lang_short = '';
$lang_prefix = 'da';

if ( isset( $_GET['lang'] ) )
{
    switch( $_GET['lang'] )
    {
        case 'en':
            $lang = 'en_EN';
            $lang_short = 'en/';
            $lang_prefix = 'en';
            break;
        case 'se':
            $lang = 'se_SE';
            $lang_short = 'se/';
            $lang_prefix = 'se';
            break;
        case 'no':
            $lang = 'no_NO';
            $lang_short = 'no/';
            $lang_prefix = 'no';
            break;
    }
}
define( 'LANG', $lang_short );
define( 'LANG_PREFIX', $lang_prefix );

putenv("LC_ALL=". $lang );
bindtextdomain('messages', ROOT .'lang/');

我的路径是/var/www/rssbot.dk/lang/。我应该正确设置 chmod,还是...?

【问题讨论】:

  • lang 下的 .mo 文件放在哪里?你有/var/www/rssbot.dk/lang/en_EN/LC_MESSAGES/messages.mo 吗?也可以试试locale -a 看看是否所有的语言环境都可用。
  • 对“路径”和区域设置是 -a 它的返回 (C en_GB.utf8 en_US.utf8 POSIX)
  • 如果我错了,请纠正我,但我不确定 en_EN 是一个有效的语言环境。试试en_US 或者只是en,这应该是区域中立的。您可能还必须在操作系统上安装英语以外的其他语言环境才能使其他语言正常工作。
  • 只是出于好奇,您的代码中的 message ids 是用其中一种语言编写的,还是只是占位符字符串?
  • 嗯,它仍然无法正常工作:/我如何测试我有麻烦?

标签: php apache gettext


【解决方案1】:

我发现某些 gettext 安装需要为您要使用的每个语言环境运行 locale-gen。我发现这尤其适用于 Ubuntu。运行locale-gen 后,您可能需要重新启动 PHP (apache)。

sudo locale-gen se_SE
sudo locale-gen no_NO

我有一个test setup(带有工作区域设置文件),可以确定您的 gettext 设置是否正常工作。

<?php

//Depending on your OS, putenv/setlocale/both will set your language.
putenv('LC_ALL=es_MX');
setlocale(LC_ALL, 'es_MX');

bindtextdomain( "su", "./locale" ); //set the locale folder for a textdomain
bind_textdomain_codeset( "su", "UTF-8" ); //set the codeset for a textdomain
textdomain( "su" ); //choose a textdomain

if( gettext("Hello World!") === "Hola a todos!" ) {
    print "We translated it correctly";
} else {
    print "Gettext setup isn't working";
}

?>

【讨论】:

  • 这对我也有用!我正在使用 docker 容器(Ubuntu 14.04 LTS)运行 LAMP 堆栈。这是一个有趣的讨论,最终导致我在 SO 上得到这个答案:bugs.php.net/bug.php?id=66265
【解决方案2】:

有一些事情可能会出错。

1- 要适应大多数系统,您需要以下几行:

<?php 
$newlocale = setlocale(LC_MESSAGES, "sv_SE"); 
putenv("LANG=$newlocale");
?>

2- 在 Linux 上,当使用带有 LC_ALL 而不是 LC_MESSAGES 的 setlocale 时,您需要在服务器上安装语言环境!

可以使用类似这样的命令安装(适用于 Ubuntu)

aptitude install language-pack-sv

或者只是用这样的命令重新配置

sudo locale-gen sv_SE

3- 指定 .mo 文件的名称和语言环境目录

<?php
// Use default.mo located at ./locale/LC_MESSAGES/default.mo
bindtextdomain( "domain", "./locale" );
?>

4- 在使用 gettext() 或 _() 时混合单引号和双引号时,您将需要使用两个 bindtextdomain!

<?php
// Double quote _("Hello world") is matched
bindtextdomain( "domain", "./locale" );
// Single quote _('Hello world') is matched
bindtextdomain( 'domain', "./locale" );
?>

5- 编码在许多地方可能是个问题。如果您的 .mo 文件与 PHP 脚本的编码不同(例如 utf-8),它可能不匹配!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    相关资源
    最近更新 更多