2017-02-18 115 views
0

在工作中,我們決定將我們的網站翻譯成3種其他語言,我一直在研究如何做到這一點。我花了一整天的時間搜索谷歌和stackoverflow,嘗試每一個不同的解決方案,但我不能讓它工作。在Windows 7 Home和PHP 7.0.8上使用gettext進行國際化

我開始害怕在Windows 7 Home Edition(我的開發機器)中無法做到這一點。

// C:\Apache24\htdocs\locale\en_GB\LC_MESSAGES\messages.mo 
// C:\Apache24\htdocs\locale\en_GB\LC_MESSAGES\messages.po 
msgid "" 
msgstr "" 
"Project-Id-Version: iArbete 1.0.0\n" 
"Report-Msgid-Bugs-To: ******** \n" 
"Last-Translator: ********\n" 
"Language: en_GB\n" 
"MIME-Version: 1.0\n" 
"Content-Type: text/plain; charset=UTF-8\n" 
"Content-Transfer-Encoding: 8bit\n" 

msgid "iArbete" 
msgstr "workIng" 


// C:\Apache24\htdocs\index.php 
if(isset($_GET["locale"])) 
{ 
    $locale = $_GET["locale"]; 
} 
else 
{ 
    $locale = 'en_GB'; 
} 

putenv("LC_ALL=$locale"); 
setlocale(LC_ALL, $locale); 
echo getenv("LC_ALL"); 

$domain = 'messages'; 
bindtextdomain($domain, './locale'); 
textdomain($domain); 
bind_textdomain_codeset($domain, 'UTF-8'); 

echo _("iArbete"); 

echo _("iArbete");應該翻譯爲 「工作」,但事實並非如此。或者我沒有得到這個概念?

---更多信息----------------------------------------- ---------------

我做了一些更改,並重新編譯了mo文件,現在看起來如此。

// C:\Apache24\htdocs\locale\en_GB\LC_MESSAGES\messages.mo 
// C:\Apache24\htdocs\locale\en_GB\LC_MESSAGES\messages.po 
msgid "" 
msgstr "" 
"Project-Id-Version: iArbete 1.0.0\n" 
"Report-Msgid-Bugs-To: ******** \n" 
"Last-Translator: ********\n" 
"Language: en_GB\n" 
"MIME-Version: 1.0\n" 
"Content-Type: text/plain; charset=UTF-8\n" 
"Content-Transfer-Encoding: 8bit\n" 

msgid "workIng" 
msgstr "iArbete" 

msgid "Menu" 
msgstr "Meny" 


// C:\Apache24\htdocs\index.php 
if(isset($_GET["locale"])) 
{ 
    $locale = $_GET["locale"]; 
} 
else 
{ 
    $locale = 'sv_SE'; 
    $locale = 'en_GB'; 
// $locale = 'ar_AE'; 
} 

putenv("LC_ALL=$locale"); 
setlocale(LC_ALL, $locale); 
// echo getenv("LC_ALL"); 

$domain = 'messages'; 
bindtextdomain($domain, './locale'); 
textdomain($domain); 
bind_textdomain_codeset($domain, 'UTF-8'); 

echo _("workIng"); 
echo _("Menu"); 

​​被翻譯成 「iArbete」 msgid "Menu"沒有被翻譯爲 「MENY」

這是怎麼回事?這感覺很奇怪,只有第一個字被翻譯。所以我重新排列了po中的單詞並重新編譯,但仍然「workIng」是唯一被翻譯的單詞。

我已經把我的文件上傳到谷歌驅動器here如果有人想看看。

+1

什麼是你的問題? – Juned

+0

爲什麼它不起作用? – Cirshiss

+0

如果你在'bindtextdomain'之前做了'var_dump(__ DIR __)',它是否顯示包含'locale'子目錄的目錄?你的'messages.mo'文件的完整路徑是什麼? – lxg

回答

0

你需要你的PO文件轉換成使用msgfmt一個MO文件:

字母寶「的.po」文件意味着移植對象,從「的.mo」文件區分開 它,其中MO代表機器對象。 [...]

PO文件是爲了其 翻譯在一個特定的目標語言的閱讀和人類編輯,和準 一個給定的包的每一個原始,翻譯的字符串。 [...]

MO文件意味着被程序讀取,並且是二進制的。 [...]

一旦PO文件是完整的和可靠的,則「的msgfmt」程序是用於車削的PO文件轉換成面向機器的格式 ,其可以由翻譯 收率高效檢索在運行時需要時可使用 程序包(請參閱MO Files)。有關 'msgfmt'程序的所有執行模式的更多信息,請參閱msgfmt Invocation

- GNU的gettext的手冊,sections 1.4 and 1.5

+0

我已經這樣做了。沒關係。因爲我無法展示它的內容,因爲它已經編譯,所以我發佈了我的消息源.po – Cirshiss

+0

我在想它可能是緩存的東西。但是,每當我進行更改時,我都會清理緩存,所以我不知道,也許還有其他一些文件。但是當我更改po文件中的某些內容時,我將刪除並重新編譯mo文件。 – Cirshiss