2017-08-16 45 views
11

我使用的國際化支持Angular2(4.0.3)記錄here。我已經生成了xlf文件,並且一切都很順利。如何在Angular中重用i18n翻譯密鑰?

但是,讓我們說,我有一個菜單按鈕鏈接到我的主頁。我使用屬性i18n="@@homeTitle"創建DOM節點。現在,在我的主頁組件,我想用相同的轉換ID在我<h1>標籤,讓我得到相同的轉換,而不必維持與xlf文件中的內容相同的多個條目。

我希望做這樣的事情的下方,有它的自動填充我<a>節點與適當的翻譯。

// home.component.html 
<h1 i18n="@@homeTitle">Home</h1> 

// menu.component.html 
<a routerLink="/" i18n="@@homeTitle"></a> 

但是,這是行不通的。節點<a>顯示爲空文本,而不是翻譯目標。 (此外,默認情況下,在自動生成的messages.xlf文件中沒有翻譯目標。)

該文檔實際上爲call out this situation,但未提供解決方案。這個問題也被稱爲了由普通字符串用戶on GitHub週一取消,但這個問題的主題不覆蓋解決這個特殊的問題。

如何在多個節點上重複使用在我的xlf文件中定義的i18n翻譯?

編輯:這是通過使用ng-xi18n --i18nFormat=xlf產生的xlf:分別

<?xml version="1.0" encoding="UTF-8" ?> 
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"> 
    <file source-language="en" datatype="plaintext" original="ng2.template"> 
    <body> 
     <trans-unit id="homeTitle" datatype="html"> 
     <source>Home</source> 
     <target/> 
     </trans-unit> 
    </body> 
    </file> 
</xliff> 

如果兩個@@homeTitle節點的解析順序進行切換,<source>變化。

+0

你能否展示關聯的xlf? 還有什麼你用來提取翻譯鍵和生成xlf? – Romain

+0

@Romain我已經添加了'xlf',但我不確定它會有多大用處。 – Eric

回答

2

TLDR;不要擔心自定義ID並正確編寫字符串。 ng xi18n工具將負責在單個<trans-unit>下匹配相同的字符串。然後,您的翻譯將被應用到整個單位。

的時間越長說明:本xi18n工具通過字符串匹配的平等在您的應用程序的字符串。每當它找到一個新的字符串,它將它與已經找到的字符串進行比較。如果有完全匹配,它將在現有的<trans-unit>中包含新字符串。如果沒有,則會創建一個新的並生成一個新的ID。

這種行爲,但是,可以通過使用自定義的ID和翻譯提示改變。如果找到一個新字符串幷包含一個自定義ID,則會檢查當前消息中是否存在此特定ID,並將其分配給現有<trans-group>(如果找到)。請注意,這個過程忽略了字符串本身,所以任何非空值將被合併到找到的具有自定義ID的<trans-group>中。空字符串被省略。

正如文檔中提到的,只有第一個具有自定義ID的元素將被檢查字符串。當第二個元素具有相同的ID時,它的字符串值將不會被解析。這意味着您可以改變您的解決方案,讓所有其他使用您的自定義ID的節點包含一個佔位符字符串。然後本地化將按照您的預期工作。

// home.component.html 
<h1 i18n="@@homeTitle">Home</h1> 
// menu.component.html 
<a routerLink="/" i18n="@@homeTitle">ANY PLACEHOLDER STRING YOU WANT</a> 

正如你所看到的,這看起來並不特別花哨。此外,您必須記住自定義ID以供進一步重複使用。我建議不要這樣做,除非絕對必要。在我看來,只寫這個字符串(在你的案例中爲"Home")比較容易,將i18n屬性打到元素上,不用擔心重複使用,因爲它會自動完成。我會使用自定義ID主要是爲了您需要有一個字符串的多個不同(上下文)翻譯。

+0

感謝您的建議。我只關注使用獨立的'i18n'屬性:比方說,我在十個地方使用了一些字符串(可能是術語*取消*)。然後我決定要在所有位置更改該單詞(例如,所有*取消*到*否*)。我現在必須找到所有十個字符串並全部替換它們。如果他們都是一個ID,我只需要做一個改變。至於你的ID匹配的想法,我明確提到這是行不通的。使用默認語言環境時,會出現「任何PLACEHOLDER STRING YOU WANT」。 – Eric

+0

好吧,是的。那麼最好的做法是讓默認字符串不是本地語言環境,而是所有語言環境的模板。即使你的默認語言是英文,你仍然會生成'messages.xlf',但是然後創建'messages.en.xlf'(提供翻譯 - 其中大部分是相同的字符串)。查看[本教程](https://github.com/martinroob/ngx-i18nsupport/wiki/Tutorial-for-using-xliffmerge-with-angular-cli),瞭解如何輕鬆實現它。 – Heehaaw

+0

我想我很失望這是最好的解決方案。當需要內置這種功能時,必須維護默認語言的翻譯文件似乎有點愚蠢。嗯,也許它將在未來版本的Angular中得到解決。 – Eric