PHP和Gettext在我的服务器上不起作用

时间:2010-05-26 16:49:58

标签: php apache gettext

我有一个网站。我正努力让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正确,还是......?

2 个答案:

答案 0 :(得分:4)

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

sudo locale-gen se_SE
sudo locale-gen no_NO

我有一个test setup(包含有效的语言环境文件),可以确定你的文本设置是否正常工作。

<?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";
}

?>

答案 1 :(得分:0)

有些事情可能会出错。

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

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

2-在Linux上,当使用带有 LC_ALL 的setlocale而不是 LC_MESSAGES 时,您需要在服务器上安装区域设置!

它可以使用像这样的命令安装(对于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),则可能不匹配!