2010-05-26 23 views
6

Tôi có một trang web. Tôi đang cố gắng để có được gettext để làm việc để các trang web tiếng Anh, Thụy Điển và Na Uy của tôi có thể đi lên. Tôi không thể có được nó để làm việc. Tôi đã làm gì sai?PHP và Gettext không hoạt động trên máy chủ của tôi

Đây là mã cấu hình của tôi:

// 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/'); 

Và con đường của tôi là /var/www/rssbot.dk/lang/. Tôi có nên làm chmod đúng không, hay ...?

+0

Bạn đặt tệp .mo ở đâu dưới 'lang'? Bạn có một '/ var/www/rssbot.dk/lang/en_EN/LC_MESSAGES/messages.mo' không? Ngoài ra, hãy thử 'locale -a' để xem tất cả các ngôn ngữ có sẵn hay không. –

+0

Yes để "con đường" và đối với ngôn ngữ -a trở lại của nó (C en_GB.utf8 en_US.utf8 POSIX ) – ParisNakitaKejser

+3

Đúng tôi nếu tôi sai nhưng tôi không chắc chắn en_EN là một miền địa phương hợp lệ. Hãy thử 'en_US' hoặc có lẽ chỉ là' en' nên là vùng trung lập. Bạn cũng có thể phải cài đặt các ngôn ngữ khác ngoài tiếng Anh trên hệ điều hành của bạn để làm cho các ngôn ngữ khác hoạt động. –

Trả lời

3

Tôi nhận thấy rằng một số cài đặt gettext cần phải có locale-gen chạy cho từng ngôn ngữ bạn muốn sử dụng. Tôi thấy điều này đúng với Ubuntu nói riêng. Bạn có thể cần phải khởi động lại PHP (apache) sau khi chạy locale-gen.

sudo locale-gen se_SE 
sudo locale-gen no_NO 

Tôi đã có một test setup (với làm việc file locale) có thể xác định xem bạn gettext thiết lập đang làm việc.

<?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

Điều này cũng phù hợp với tôi!Tôi đang chạy một LAMP stack bằng cách sử dụng docker container (Ubuntu 14.04 LTS). Đây là một cuộc thảo luận thú vị mà cuối cùng đã dẫn tôi đến câu trả lời này trên SO: https://bugs.php.net/bug.php?id=66265 –

0

Có một vài điều có thể xảy ra.

1- Để chứa hầu hết các hệ thống, bạn cần những dòng sau:

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

2- Trên Linux, khi sử dụng setlocale với LC_ALL thay vì LC_MESSAGES, bạn sẽ cần phải có cài đặt locale trên máy chủ!

Nó có thể được cài đặt với một lệnh như thế này (cho Ubuntu)

aptitude install language-pack-sv 

Hoặc chỉ cần tái cấu hình với một lệnh như thế này một

sudo locale-gen sv_SE 

3- Xác định tên tệp .mo và thư mục ngôn ngữ

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

4- Khi trộn dấu ngoặc kép đơn và kép khi sử dụng gettext() hoặc _(), bạn sẽ cần sử dụng hai bindtextdomain!

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

5- Mã hóa có thể là một vấn đề ở nhiều nơi. Nếu tệp .mo của bạn không có cùng mã hóa (ví dụ: utf-8) so với tập lệnh PHP của bạn, tệp có thể không khớp!

Các vấn đề liên quan