2011-01-13 30 views
5

Tôi có một .po và một tập tin .mo trong một thư mục có địa chỉ là /locale/nld_nld/LC_MESSAGES/. Cả hai tên tập tin là tin nhắn. Tôi đã cố gắng sử dụng đoạn mã sau:Làm thế nào để sử dụng tập tin po/pot với php?

try.php:

<?php 
require_once("Localization.php"); 
echo _("Hello World!"); 
?> 

các Localization.php goes here:

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

Cả try.php và các tập tin Localization là trong cùng một thư mục. Ngoài ra, tôi sử dụng xampp. Tôi cũng đã triển khai phpinfo();. Trong bảng, phía trước 'Hỗ trợ GetText', được bật đã được đề cập. Các tin nhắn .pothư.mo là các tệp hợp lệ mà tôi đã tạo bằng cách sử dụng poEdit. Tôi là người dùng cửa sổ. Tuy nhiên, khi tôi mở try.php, nó đơn giản lặp lại Hello World! (không phải là chuỗi đã dịch của nó. Ngoài ra, tôi đã dịch .po tệp 100% (theo số poEdit) .Tuy nhiên, tôi không nhận được kết quả, một chút trợ giúp về điều này sẽ được đánh giá cao

Cảm ơn ! trước

Trả lời

2

Khi nhìn lại vào mã tôi có. tại chỗ trên một trang web làm việc cho bản dịch tiếng Tây Ban Nha, tôi nhận thấy tôi cũng có cùng một dòng theo thứ tự khác nhau, có lẽ điều đó tạo nên sự khác biệt? Ví dụ:

<?php 
putenv('LC_MESSAGES=es_ES'); 
setlocale(LC_MESSAGES, 'es_ES.utf8'); 
bindtextdomain('es','/full/path/here/application/locale'); 
textdomain('messages-es'); 
bind_textdomain_codeset('messages-es', 'UTF-8'); 
?> 

Đối với các mã trên để làm việc, tập tin .mo của tôi là trong thư mục /full/path/here/application/locale/es_ES.utf8.

Có lẽ đoạn mã sau tôi đã sử dụng trước khi có thể giúp bạn khắc phục sự cố hơn nữa:

<?php 
function TestLang($langCode) { 
    echo('<b>TESTING LANG CODE: ' . strtolower($langCode) . '</b><br />'); 
    putenv('LC_MESSAGES=' . strtolower($langCode) . '_' . strtoupper($langCode)); 
    echo('LC_MESSAGES: ' . getenv('LC_MESSAGES') . '<br />'); 
    $localeResult = setlocale(LC_MESSAGES, strtolower($langCode) . '_' . strtoupper($langCode) . '.utf8'); 
    echo('Locale: ' . $localeResult . '<br />'); 
    $textDomain = bindtextdomain(strtolower($langCode), ROOT . '/' . APP_DIR . '/locale'); 
    echo('Text Domain: ' . $textDomain . '<br />'); 
    textdomain(strtolower($langCode)); 
    $codeSet = bind_textdomain_codeset(strtolower($langCode), 'UTF-8'); 
    echo('Code Set: ' . $codeSet . '<br />'); 
    echo('.mo File: ' . $textDomain . '/' . $localeResult . '/LC_MESSAGES/' . $langCode . '.mo<br />'); 
    echo('<br />-- ' . _('Hello World!') . ' --<br />'); 
} 

TestLang('en'); 
TestLang('de'); 
TestLang('es'); 
TestLang('fr'); 
// etc.. 
?> 
+0

textdomain() thường là cuộc gọi hàm cuối cùng (thực sự nó có thể cần thiết trước mỗi gettext aka _() gọi nếu bạn làm việc với các tên miền mutiple.Trước tiên, bạn ràng buộc tất cả các tên miền, sau đó bạn chọn một tên miền. – eckes

+0

Trong ví dụ của bạn, bạn sử dụng hai tên miền khác nhau 'es' và 'thư-es'. Điều đó có thể không hoạt động (và thông thường bạn không có mã định danh ngôn ngữ trong tên tệp vì nó được định nghĩa bởi thư mục thay thế). Vì vậy, "/full/path/here/application/locale/es_ES/LC_MESSAGES/messages.mo" sẽ là tên tệp của miền "tin nhắn" và các LC_TYPE es_ES. – eckes

0

Output giá trị trả về của $result=bindtextdomain($domain,$path), nó sẽ cho bạn biết nếu con đường địa phương của bạn thực sự là con đường mà bạn mong đợi file dịch của bạn với cuộc sống. Và sau đó kiểm tra quyền truy cập tệp của các tệp đó nếu chúng (và các thư mục đến thư mục gốc) có thể truy cập được bởi người dùng www. Đó là một nơi nào đó trong ./locale/LC_MESSAGES/nld_nld/

textdomain($domain) phải là phương pháp cuối cùng (trước bản dịch gettext thực tế). Tham số miền của bindtextdomain và textdomain phải là cùng một tên miền (không có trong câu trả lời của bạn) và bằng tên cơ sở của tệp mo.

Đảm bảo không có tệp php nào của bạn sử dụng tên miền văn bản khác, đặc biệt khi bạn sử dụng "require_once".

BTW, mã bạn tìm kiếm mã định danh địa phương trong yêu cầu (không có bộ lọc) và sử dụng nld_nld làm mặc định failback, tôi sẽ đặt ngôn ngữ thông thường (ngôn ngữ chính như "vi").

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