Showing posts with label L10n. Show all posts
Showing posts with label L10n. Show all posts

2008-09-18

Firefox擴充套件本地化

之前已經提過如何自己把Firefox的擴充套件翻成其它語言。現在發現在mozdev.org有個很漂亮的華語的說明。不過:那篇文章雖然解釋如何把翻譯檔案放回去套件裡面,但是我還是覺得把那些檔案寄給那個套件的作者,這樣才有辦法把你的翻譯跟其他人分享……

2008-04-21

Poot, poot, poot, poot, pootle...

I doubt that anyone can help me with this (as usual), but I try it anyway, so at least you can see what entertaining problems are brightening my day: I have been trying to set up a Pootle server for a while. Basically, Pootle is a very nice software, allowing very comfortable (though not as stylish as launchpad) software localization. But...

Pootle comes along with its own web server. Although it is written in Python, setting up a Pootle server is not done by copying a few files into a web server's hunting grounds. (though that should be possible somehow) I couldn't get its requirements fulfilled on Ubuntu 7.04, but it was in the repositories in 7.10, so I set up a machine with that. That machine also runs ISPConfig, supposed to ease account management.

There is a bug in pootle's package in Gutsy, and the recommended fix did not work for me, but at least Pootle would run... That machine is running Apache, plus a second Apache on port 81 for ISPConfig. Now Pootle comes with its own server on port 8080, and it wants to be executed by root.

Originally I wanted to "put" pootle into a user account, but the docs are a bit "fuzzy" here: The mentioned scripts and archive files do not exist on Ubuntu, and there is no hint what files I really need and how I could collect all necessary files manually. This is one problem.

Another problem is that I need to redirect port 8080 from that account (if I get it to work one day) to port 80, for which I probably need mod_proxy. The pootle docs seem to suggest a forward proxy (though with a few settings not recommended by the mod_proxy docs), while in my understanding a reverse proxy should be used. But again, no idea how to set that up properly...

So why I am creating myself all that trouble? Short answer: Because I've gone mad. Long answer: I would like to set up a localization site. I would like to use it for localizing Postnuke and some other FOSS. I know that my students will not be interested in this, but rumours claim there are people outside our school... And with localized Chinese versions, a few nice programs may become a bit more popular here in Taiwan...

So, you can't help me either? Never mind, I got used to that, I'll see that I get it done myself...

2007-12-12

社會組科技須知 - 軟體本地化: gettext (2)

我已經說過gettext為本地化的好處。那時候我提過幾次po檔專用的編輯軟體多好用。那,我們看一下有什麼軟體。最有名的應該是poedit。不管你用的是WindowsOS XLinux,到處都可以用poedit。我自己沒有Windows主機,所以我能放的是OS XLinux的畫面。先OS X:


而這個是Linux版:


兩個版本有讀的po檔不一樣,一個是Drupal的語言檔(華語),另一個是Postnuke(日語)。我們看一下有哪一些比較重要的部分:


我已經說過,源語言的內容沒有辦法改,軟體只會顯示那些視窗。翻譯可以改的是下面的目標語言視窗。在左邊我會寫翻譯,在右邊可以留下說明、意見等。

在狀態列(最下面)軟體會告訴我們總共有多少個記錄,多少個還要翻,多少個模糊。如果有未翻的記錄,poedit會先放那些給我們看。不過,我們的本地化可以開始之前我們一定先要輸入一些設定:


我們一定要告訴poedit誰想使用它,因為poedit讀pot檔(樣本)的時候會自動地把這些資訊放進去。如果你打算較長期做這種本地化的工作,你最好先找一個比較“穩定”的信箱,像GMail或類似的地方。不要換工作或學校就沒有辦法聯絡你,有人可能需要你……

在上面的設定也可以看到一個Translation Memory選項。我希望你知道這種翻譯記憶是多好用的東西…… 所以,高興吧,poedit也提供這個功能。


我們也可能要選語言方面的設定。我希望你知道編碼是什麼東西…… 上面的設定是屬於另外一個軟體,gtranslator。它只有Linux版,而且是為了Gnome做的。


Gtranslator也有TM(翻譯記憶),所以它一段時間有學你的翻譯之後也可以自己提供目標語言版本。這個版本不會完美,但是你用越久,它的版本越準。不對的地方當然可以修改。所以,如果你沒有能力或懶得做翻譯,電腦沒有辦法替你工作,但是它可以讓你的工作輕鬆多了。

這是gtranslator:


而這裡有為了KDE做的軟體,KBabel


你會發現,雖然有三個不同的軟體,兩個作業系統的版本,但是它們在很多方面一樣:它們都會給我們看一個記錄裡面的資訊,讓我們方便地翻,允許我們把狀態改成模糊等。Windows的poedit也一樣,所以不用怕。

你只要先輸入基本資料,包含目標語言跟編碼,下載一個pot檔,讀進去,然後就可以開始翻。翻完後軟體會自己“另存”一個檔案,然後你只需要把那個檔案寄給負責你做本地化的那個軟體的人。這麼簡單……

OK,技術方面的部分其實會這麼簡單。如果你真的是語言方面的專家,我想你應該自己知道在翻譯的過程中要注意什麼。我這裡只想讓你不會怕技術……

以上介紹的其實都是個人使用的軟體。不過,軟體開發有合作的話就更好做,對不對?翻譯也一樣。所以,我在上面談的同樣的功能現在也可以在網路上使用。

一個不錯的軟體是Pootle。你可以用它自己設一個本地化網站。而如果你想看到一個真漂亮的開發(包含本地化)的環境,你一定要逛launchpad。這是Canonical為了Ubuntu開發建的網站。這個網站真棒……

2007-12-10

社會組科技須知 - 軟體本地化: gettext (1)

我蠻確定你沒有聽過gettext這個名稱。那它到底是什麼呢,而為什麼語言方面的人要知道或甚至了解它?

首先,如果你打算自己寫程式,你可能要花一點時間自己看gettext相關的資料。我沒看過華語的手冊,但是你應該有習慣這一件事。不過,如果你是筆譯或另外語言相關的人,我想在這裡解釋你關於gettext可能要知道的部分。

Gettext是一個library,一種功能庫。它不是“某一種”功能庫,它的用途是軟體國際化跟本地化(i18n/l10n)。所以,gettext能夠幫助寫程式的人做出多一些語言的版本。

它也會幫助翻譯人員,因為它會把軟體的語言檔提供在一個特殊的格式。那種檔案叫"po"或"pot"檔。"pot"表示它是范本檔,這兩個的區別跟一般文書處理的檔案一樣。

這些檔案對翻譯那麼有用是因為它們非常適合處理各種各樣的語言,因為它們可以包含許多跟翻譯過程有關的資訊,因為它們專用的編輯軟體保證連電腦使用方面較弱的人(社會組……)不會“破掉”東西。那我們看一下每一點。

能夠處理各種各樣的語言:你不只能選你要用什麼編碼,你也可以設定你的目標語言使用幾種(以數量定的)復數。華語沒有復數,但是英語有一種,俄語有兩種,而一些語言甚至有三種復數。

Gettext的手冊也強調軟體輸出詞句的準備,說明怎樣的string才比較適合順利地翻成其它語言。這些是軟體設計的人員或“語言顧問”需要注意的。沒有做到的話,可能沒有辦法翻到一些語言或至少會遇到困難。

可以包含許多跟翻譯過程有關的資訊:po檔開頭已經提供不少資訊,包含翻譯人員相關資訊,像名字,信箱等。Open Source Software在華語雖然被稱呼“自由軟體”,但是它還是會尊敬每一個人的貢獻,所以也會記錄誰有翻哪一個部分。

不過,更有趣的是檔案內容。我先“偷”一下手冊相關的部分

# translator-comments
#. extracted-comments
#: reference...
#, flag...
msgctxt context
msgid untranslated-string
msgid_plural untranslated-string-plural
msgstr translated-string
msgstr[0] translated-string-case-0
...
msgstr[N] translated-string-case-n

一個記錄可以包含這些部分。那我們看一下一個一個有什麼作用:

# 這樣開始的行包含翻譯的意見或說明。

#. 這裡有設計軟體的人在程式碼或在這個檔案留下給翻譯的一些建議或說明。

#: 在這裡,軟體會記錄這一句從哪一個(哪一些)檔案的哪一(些)行來,因為翻完後也要把結果再放回去。人一般看不到這一行的內容,軟體才用得到。

#, 狀態。唯一跟翻譯有關(而翻譯可以改)的狀態是"fuzzy",模糊。如果有人覺得原文跟結果不太相當(因為原文有變,翻譯人不完全了解原文的意思等),他可以把這個記錄的狀態改成“模糊”,所以其他人會知道哪裡還要再看。

msgctxt 如果源語言為了表示不同意思使用同樣的詞,同樣的表現方式,我們可以有幾個同樣內容的msgid,但是經過msgctxt的說明告訴翻譯人員這一句要用在什麼環境,在什麼情況下,所以在目標語言可以選相當而不同的版本。

msgid 這裡終於有源語言的詞句。

msgid_plural 如果也想顯示源語言的復數格式,就會放到這裡。

msgstr 翻出來的,目標語言的版本會在這裡。

msgstr[0] 如果目標語言支援或需要復數,這個復數版本會在這裡。如果一個語言有幾種復數,我們另外也可以看到其它msgstr[n]的行。不過,因為華語沒有復數,我們一般用不到。

現在會怕,對不對?好復雜…… 別怕!不要忘記:專用的編輯軟體保證連電腦使用方面較弱的人(社會組……)不會“破掉”東西!人平常看不到每一行,專用的編輯軟體會處理,會給翻譯人員他們需要的,而不會讓他們弄壞東西。

例如,翻譯雖然(必須)看到源語言的詞句,但是完全沒有辦法改。可以改的只是目標語言的部分。這裡你不可能不小心刪掉源語言的句子,放心!談到亂改,你唯一能夠“亂改”的地方是目標語言,但是因為源語言一直還在,每個人能發現有問題,而能把狀態改成“fuzzy”,所以下一個懂目標語言的人知道他還要看哪裡。

你也不用擔心沒有(不會)翻完。專用的編輯軟體會馬上知道這個檔案包含多少個記錄,其中多少個已經翻好,多少個比較模糊等。所以,如果你想幫忙做一個軟體的本地化,但是沒有很多空或部分不太熟,你也可以翻你有辦法翻的部分,然後把檔案寄回去,讓下一個人繼續翻。(這裡有好一點的方法,改天會談。)

今天我先想談理論。我希望你會大概了解gettext可以為你(翻譯)做什麼。如果你真想了解,你就可能要用po檔做本地化。而如果你之前有做過其它非應用gettext軟體(Firefox擴充套件等)的本地化,你也會了解gettext對軟體國際化與本地化提供多大的貢獻。

gettext (2)的文章我會介紹專用的軟體,讓你了解什麼是“方便”……

2007-11-03

社會組科技須知 - 軟體本地化: 火狐狸擴充套件

現在幾乎每一個人有至少一台電腦。雖然很多人不知道怎麼正確地使用那一台電腦,但是每一個人還是很快樂地使用。雖然幾乎沒有人願意看一個軟體的使用手冊或它內建的說明,但是大家(特別在台灣)一定要他們自己母語的版本。不過,不一定每一個軟體是在台灣寫的,所以可能需要有人把一個英文版翻成中文。而這種事有時候不會很困難。

Mozilla Firefox是一個真不錯的瀏覽器,比你的IE好一些。你最好安裝,用一下。(而且順便也安裝Opera)Firefox一個較特別的地方是它的擴充套件。Firefox本身會提供基本的瀏覽器的功能,但經過擴充套件我可以做個人化,可以讓它變成我要的樣子。

那些擴充套件也是軟體。如果它們有使用者介面,可能要有人做“本地化”,把使用者介面翻成中文。寫一個擴充套件的人不見得懂中文,而你 - “不懂電腦”,對不對?好,那我簡單地說明一下:

這種擴充套件是一個"XPI"檔。意思是,檔案的“大名”是"name.xpi"。我們想象一下我們的套件叫"foxytunes",所以我們下載一個檔案叫"foxytunes.xpi"。不過,它其實是普通的ZIP壓縮檔。所以,我們可以把"xpi"改成"zip",然後就可以解壓縮。

我們現在看到一些目錄跟檔案。對我們有趣的是"chrome"目錄,其它我們可以不管。裡面我們會發現至少一個檔案:"foxytunes.jar"。(檔案名就是套件的名字)如果還有其它檔案,它們可能比較難過 - 因為我們不理它們。

"JAR"代表Java ARchive,所以我們又碰到一個壓縮檔。如果你的Windows XP或Vista沒有辦法解壓縮,你可以試試用ExtractNow。(或者你可以試試換一個比較方便的作業系統)解壓縮之後,我們應該有一些目錄。我們要的目錄叫"locale"。

如果你看不到這個目錄,這表示寫套件的人還沒有考慮到多語言化。那時候,換別的套件吧。不過,我們套件有這個目錄,所以我們進去。我們應該看到至少一個目錄。它的名字可能是"en-US"、 "en-UK"或也許有"de-DE"。

前面是語言,後面是國家。所以,"en"代表英文,"de"德文等。"en-US"是美國的英文版,"en-UK"是英國的。我們先在某一個地方建立一個"zh-TW"目錄,然後把"en-US"或"en-UK"(只有其中一個!)裡面所有的檔案拷貝到到"zh-TW"。現在我們要看檔案。

我們應該可以看到至少一個DTD檔。裡面會有一些tag,有點像HTML或XML。我們看一下具體的例子:

《!--ENTITY foxytunes.tools.label "Tools"--》
《!--ENTITY foxytunes.tools.key "T"--》

一個"Entity"是一個實體,一個元素,是這個套件使用的一個訊息。之後的"foxytunes.tools.label"是這個實體的名稱,而引號之間的部分才是真的要輸出的訊息,這裡是"Tools"。第二行很像,但是有點不同:這個實體定一個按鈕,"T"。(按"T"就可以叫出工具選項)

這裡的工作很簡單:我們只需要把兩個引號之間的部分翻成中文,但是不要動"key"實體!所以,把以上的例子翻成中文的話會變成這樣:

《!--ENTITY foxytunes.tools.label "工具"--》
《!--ENTITY foxytunes.tools.key "T"--》
簡單,對不對?下一步。我們可能看到一個"about.dtd"檔,裡面有(沒有想到吧)關於套件的資訊。不過,可能不只有這些。寫套件的人如果有做好的話,應該有地方你要改一個數值(看裡面的說明!),而且有地方你可以留你的資料:名字、e-mail等。如果你有翻這個套件,你也有貢獻,所以當然也要列你的名字。

比較害羞或在乎隱私的人可以用暱稱,但是e-mail最好要是比較可靠(長期可聯絡到)的。如果再用foxytunes的具體例子,這三行

《!ENTITY about.is.translated "0"》
《!ENTITY about.translatedby.name ""》
《!ENTITY about.translatedby.url ""》

要變成

《!ENTITY about.is.translated "1"》
《!ENTITY about.translatedby.name "Fang Sheyu"》
《!ENTITY about.translatedby.url "kosh@vorlon.org"》

原則上你的名字也可以用漢字寫,但是我會建議用羅馬字,因為這樣大家有辦法讀或寫你的名字。不過,可能還有其它檔案。裡面可能有這種內容:
enable=Enable
disable=Disable
unknown=Unknown
這些也很簡單:不要動"="之前的部分,但是要翻之後的。像這樣:
enable=啟動
disable=停止
unknown=未知
而且,我們可能遇到這種“奇怪”的句子:
theCurrentTimeIs=The current time is: %S
裡面的"%S"很重要,它是程式的輸出。這裡是時間,但是也可能是一個檔案名,帳號名稱,溫度,任何數值。我們先要了解它在原文的句子有什麼作用。這裡是受詞,而且我們可以較容易了解它代表時間。有時候我們在目標語言可能要把它放在句子裡不同的位子,所以先要確認。這次沒有什麼問題:
theCurrentTimeIs=目前時間是: %S
我們可能碰到的檔案(目前)只有這些。如果要做這種套件的本地化,我們最好先把"en-US"或"en-UK"的檔案拷貝到我們"zh-TW"目錄,然後修改內容。不過……

我們存檔一定要用UTF-8編碼!而且,我們其實可以用一個方便一點的editor,不需要用Windows的notepad(記事本)。只要找一下"windows free xml editor unicode"或"windows editor unicode",就會有一些選擇。抱歉,我已經幾年不在用Windows,所以自己不在使用那些editor。也許別人可以提出一些建議?在OS X 我用TextWrangler,在Linux大部分是BluefishScreem

翻完了?一切都正確?最後確認一下,然後把一整個"zh-TW"目錄壓縮(例如ZIP檔),然後寄給擴充套件的創作人。他會把你的翻譯加進去,然後線上更新套件。

恭喜!你剛把一個軟體改成多一些人可以用!

2007-10-22

社會組科技須知 - 電腦與字

台灣的教育制度會從國中開始把學生分成“社會組”(”文組“)跟“自然組”(”理組“)。目的好像是讓學生較早開始專心走其中一個方向,可以在這個專長達到較高的水準,因為不用花時間學其它方面的事。不過,這個做法也有缺點:每一組缺另外一組專長的基本知識。雖然有人會說這當然是這種措施的結果,某一方面根本就是目的。但是我在我的工作天天接觸社會組的人,發現他們其實缺很多對我來說算是常知的基礎。而且,這些缺乏會導致很多不便。社會組的人在“科技”方面很容易被騙,而且也不太有辦法用2007年的時候普遍的周邊科技。所以我想在這個“社會組科技須知”系列簡單地解釋一些“科技”基礎。重點是幫助語言相關的人多了解他們周邊的“科技玩具”,主要是因為我希望我的學生不只“會語言”,而有辦法應用。這次的題目:電腦與字。

今年(至少在我的世界)2007年。所以,如果我要寫文件,我會用電腦。(OK,我快二十年前已經這樣做,主要是因為我寫的字太難看。)筆譯也會用電腦,不只為了寫目標語言的文件,原來的文件根本已經是電子檔。不過,台灣的大學跟學院怎麼教筆譯?上課時發一張紙,叫學生在另一張紙上寫他們翻譯版本 - 可用手寫。

如果那些學生畢業之後想幫一家公司翻一些網路上要用的文件,他們可能很快就遇到一個很痛苦的問題:亂碼。他們花不少時間翻文件,存檔,送出去,但是公司完全沒有辦法使用。為什麼?

小時候,我們上課的時候可能要送一個小小的信給教室裡的另一個同學。如果被老師發現,老師會把我們的信拿走,而且會看它。為了偽裝內容,我們用一個簡單的表格,一邊列字母表所有的文字,另一邊再列一樣的字,但是亂改順序,像這樣:
A B C D E F G H I J K L M
Q W E R T Y U I O P A S D

N O P Q R S T U V W X Y Z
F G H J K L Z X C V B N M
(我承認這個順序不太亂,但是大部分的老師們還是不會“破”這個加密方法。)兩邊的學生必須有同樣的表格,而且千萬不可以讓老師發現它。用這個表格,原來一句"see you after school"會變成"ltt ngx qyztk leiggs",但是收信的學生因為有同樣的表格會知道真的意思。在用拼音文字的國家,學生可以這樣做,在台灣需要的表格可能較大。(不過,這裡有一種東西叫注音符號……)

為什麼要說這個故事?因為電腦用一樣的做法,它只有兩個地方不一樣:電腦用的表格不是秘密,而是公開的標準。而且,電腦的表格只有一邊會有文字,另一邊都是數字。電腦本身只能處理數字,而且原則上只能處理位元。不過,因為there are only 10 kinds of people in the world: those who understand binary, and those who don't,我們在這裡還是用對人比較容易了解的數字。

早期的可以顯示文字的電腦用一個叫"ASCII"的表格。如果我們在那種電腦上寫"World",記憶體裡面電腦會記錄"87 111 114 108 100"。So far, so good. 不過,這個ASCII表格好像沒有包含德文的"Ö",法文的"ç"或丹麥文的"Ø"。那些國家的人被叫要用ASCII表,沒有辦法用到自己的語言需要的一些額外的字,當然有一點點不高興。所以,他們建立自己的表格:他們保留原來ASCII裡面已經有的文字,然後把一些他們覺得不那麼重要的符號換成自己需要的文字。

不過…… 如果我們看這個新的表格,我們會發現上面舉例的三個文字其實都有同樣的數值:92。當時,人還沒有想到網際網路或全球化,每一個國家做它自己的事。如果當時要列印,一定要確認在印表機上有沒有設好“編碼”。如果有設成丹麥文,但是要印德文的文章,德文的"äöü"就變成"æøå" - 不好玩。所以,後來有一些大一點的表格,但是這些表格還是最多只能包含200多字,不可能包含世界所有的拼音文字。所以,如果一台電腦要有辦法用多一些語言的字,它必須“知道”多一些表格,也必須有辦法切換那些表格。用錯表格,就會有一些亂碼。

不過,這樣沒有辦法在同一個的文件用屬於不同“表格”的語言。而且,像中文或日文的漢字要怎麼辦?好像不只有200個字…… 沒錯,這些表格會大一點,數值也要大一點。不過,基本的問題還是一樣:如果電腦用錯表格(編碼),就會有亂碼。其實,我們現在會有辦法在同一個文件用所有的語言,而不需要”切換“,因為有一個真大的表格(盡量)包含這個行球上所使用的字。(不過,這裡也有幾種表格,用不同的編碼方式,最流行的是UTF-8。)

所以,如果我們要存一個文字當,我們可能要注意我們要用什麼編碼,特別是軟體本土化(L10n)的時候。但是還有一個地方編碼錯誤造成很大的麻煩:網路上的HTML文件。原則上,每一個HTML文件(所以,每一頁,而且每一個frame也要)必須包含編碼資訊。十幾年前定的HTML規格要求這些設定。

如果按照HTML規格做,不管什麼語言,什麼作業系統或什麼瀏覽器,一定要正確地顯示出來。不過,”我會Frontpage“族從來沒有學HTML,而Frontpage的原始設定不會輸出標準的HTML。一些”目前只會support Microsoft“的廠商可能也要參考規格一下…… 所以,如果網頁上有亂碼出現,平常不是訪客電腦的問題,是提供那些內容的人在某一個地方做錯,所以訪客的電腦不知道現在到底要應用哪一個表格顯示字。

此外,這個網站用UTF-8,所以在一個文件使用多幾種語言也沒關系……