2010-05-26 129 views
6

我有一个网站。我试图让gettext工作,以便我的英语,瑞典和挪威站点能够出现。我无法让它工作。我做错了什么?PHP和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正确还是...?

+0

你把.mo文件放在'lang'下的哪个位置?你有'/ var/www/rssbot.dk/lang/en_EN/LC_MESSAGES/messages.mo'吗?还可以尝试'locale -a'来查看是否所有的语言环境都可用。 – 2010-05-26 17:39:47

+0

是为“路径”,并locale -a命令其返回(C en_GB.utf8 en_US.utf8 POSIX ) – ParisNakitaKejser 2010-05-26 17:44:07

+3

纠正我,如果我错了,但我不知道的en_EN是一个有效的语言环境。试试'en_US'或者只是'en',这应该是区域中立的。您可能还需要在操作系统上安装英语以外的其他语言环境才能使其他语言正常工作。 – 2010-05-26 18:06:18

回答

3

我发现某些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"; 
} 

?> 
+0

这也适用于我!我使用Docker容器(Ubuntu 14.04 LTS)运行LAMP堆栈。这是一个有趣的讨论,最终让我在SO上得到了这个答案:https://bugs.php.net/bug.php?id = 66265 – 2014-10-04 12:40:32

0

有几件事情可能会出错。

1,以适应大多数系统中,你需要下面几行:

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

2 - 在Linux上,使用的setlocale时LC_ALL的代替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),则它可能不匹配!

相关问题