2010-11-06 29 views
3

我已經完成了一些網站和應用程序,支持多種語言,我已經在代碼中使用了語言xml文件和關鍵字。對於我的網絡應用程序,我相信這種方法很糟糕。我喜歡閱讀和理解我的HTML代碼。此代碼沒有任何意義:翻譯Web應用程序的不同方法

<h1><?= translate('main_headline'); ?></h1> 

它看起來不錯的開始,但是剛剛結束了不愉快的程序員,因爲添加新功能的過程,現在需要把東西在個XML所有的時間。

我的解決方案(我只是寫了一個簡單的測試PHP解析器一個小時前,你認爲這將在一個大型項目的工作?)

我用英語作爲我的基本語言,這是我如何源文件的外觀:

<h1>{{ I love colors }}</h1> 

我的解析器將使用文本(真實文本)作爲字典數組的關鍵字。在這個例子中,我正在從美國英語翻譯成英國英語。

$dictionary['I love colors']['en_GB'] = 'I love colours' 

因爲它已經在源文件中,所以我的基礎語言不需要字典。

還有很多東西像緩存,回退,字典存儲等。你認爲它可以在大型項目中工作嗎?那裏有我沒有考慮過的事情?

+0

這種類型的字典是由phpBB成功使用的(儘管沒有解析方面的東西。)但是,每種語言應該有一個字典文件,如果你需要en_GB, (1)避免加載20種語言,並且(2)在訪問字典時不需要將其作爲關鍵字。 – 2011-09-19 05:33:35

回答

3

與此相關的一個缺陷是應用程序的兩個不同部分可能需要對同一個詞/短語進行不同的翻譯。最明顯的例子是homograph,例如, 「關閉」(附近)和「關閉(關閉),但也有其他的可能性也

一個人爲的短語的例子是:

在一個部分,‘我愛我的色彩’只是指文字顏色。
在另一方面,它的意思是「我愛我的標誌」

應:

$dictionary['I love my colors']['es_ES'] 

是「我encantan錯誤彩之」或「我encanta英里班德拉」它以某種方式既

這就是爲什麼通常在消息目錄中使用唯一ID或行號的原因。

+0

我不認爲他建議它動態翻譯每個單詞。人會手動翻譯每個短語並對這些翻譯進行硬編碼。 – 2010-11-06 21:53:59

+0

@ Thr4wn,我知道他沒有使用自動翻譯功能。正如我所說,他的消息目錄的問題是它只考慮原始文本。如果應用程序的兩個部分使用相同的文本用於不同的目的,這將失敗。 Jochen的解決方案很好,因爲它爲每封郵件提供了一個唯一的ID。其他解決方案(例如GNU gettext)使用原始行號。 – 2010-11-06 21:56:09

+0

啊,我明白你現在在說什麼。 – 2010-11-06 22:00:14

0

是的,這是一個很好的方法。

我們使用類似於: || 4332 ||我喜歡顏色||

然後你可以解析你的文件,提取所有的ID(4332),並在數據庫中查找翻譯。

+0

你如何跟蹤所有的ID? – Znarkus 2010-11-06 23:35:20

0

編輯:其他的反應,現在是更好的比我:)

我不知道有第二種選擇的任何問題(而且我也沒有經驗,國際化的工作)。

我看到第二個選擇的唯一潛在問題是可逆性。如果有人返回並更改文字以表示「我喜歡顏色」,則有人必須總是確保他們回到翻譯並更改英文鍵。但是,你在做i18n的事實讓我認爲已經有人的工作是處理繁瑣的翻譯工作,所以我不會將其視爲一個問題。

0

我更喜歡爲這類東西使用組合標籤,這樣我可以在上下文和意義上包含註釋,這些東西對翻譯人員非常有用。例如:

<h1><l10n id="blah" notes="This is a header for a section on blah blah, title case">Blah Blah</l10n></h1> 

同樣,你可以使用由屬性爲alttitle文本。

雖然您需要注意不同的上下文(HTML,<script><style>,PHP,各種模板語言...)。你還需要小心詞序和性別問題,但這些都是標準的L10N問題。

然後,您可以將所有翻譯的文件預處理爲單獨的目錄(每種語言一個),並避免在運行中生成翻譯的開銷。

1

一些考慮和想法。

  • 將短語重複使用降到最低。我的經驗是,使翻譯的維護更容易。

  • 語法必須與語言無關,因爲您可能會使用自己的文件類型來翻譯PHP,JS,HTML等。換句話說,不僅PHP模板需要解析,.js文件也可能包含文本。

    {{ <img src="heading-en.png" alt="Heading" /> }} 
    alert('{{ some text }}'); 
    
  • 上面的alert例如將打破,如果翻譯文本包含在',應該得到某種處理。

  • 您必須以某種方式允許翻譯中的變量數據。請考慮下面的例子。

    {{ <?= $num ?> apples cost <span class="price"><?= $price ?></span> with <?= $discount ?>% discount }} 
    

    這可能無法正常工作,或者至少不允許變量名稱更改或內聯表達式。下面的例子會更好。

    {{ 
        %num% apples cost <span class="price">%price%</span> with %discount%% discount 
        } num:<?= $num ?> 
        , price$:<?= $price*$discount ?> 
        , discount:<?= round($discount*100) ?> 
    } 
    

    ..其中價格$可能意味着它是一個價格,並轉換爲正確的貨幣。

  • 應該處理貨幣。

只是想起了幾件事情。祝你好運;-)