Asp.net-Mvc

如何在本地化文本中嵌入連結

  • November 17, 2009

我正在國際化一個 ASP.NET MVC 應用程序,但我不確定如何處理連結文本。以以下為例:

  • 英語:“請登錄以繼續。”
  • 英語:“登錄以繼續。”

由於“登錄”是超連結的,所以當文本本地化時,我必須讓翻譯者標記哪個相應的單詞或片語應該超連結,例如 Entre。

什麼是最好的策略解決方案?

是否有標記特殊文本的標準方法(以及使用翻譯結果的標準方法)……或者我是否走錯了路,期望我的內容和展示資訊如此緊密耦合(儘管我不認為在這種情況下以任何方式移除聯軸器)。

目前實施:

我目前正在使用 Views 的本地資源文件和HtmlHelper 上的擴展方法來獲取本地化的刺痛:

<%= Html.Resource("LoginMessage")%>

更新: 請參閱基思的回答

我發現它最有幫助,但係統自動選擇了另一個。

我目前使用的是他以下設置:

我有一個包含主要文本的全域資源文件,名為 Strings.resx(Strings.NL-nl.resx 等)。在此旁邊,我有我的全域文件,其中包含我的操作連結的所有本地化。即:ActionLinks.resx 和 locals。

現在我要做的是,在我的 Strings.resx 中,我有類似的東西:

字元串.resx

請{0}繼續

本地語言 Strings.NL-nl.resx

{0} 繼續

現在的訣竅是執行以下操作:

<%= Html.Encode(string.Format(Resources.Strings.ControllernameViewnameKey, 
Html.ActionLink(Resources.ActionLinks.login, "Account", "LogOn")))

如果您的連結中需要多個變數,您可以提供一組對象

string.Format()

鍵名是我自己的約定,用於理解主文本在哪裡使用(什麼頁面)。因為我的主文非常具體。當然鑰匙也可以自己製作。

有關我如何做到這一點的更多資訊,您可以查看我對我自己的問題的回答 這裡


編輯

當然,您可以使用本地文件而不是全域文件,但我非常喜歡我的強類型資源:)。

我認為這歸結為4個選擇:

  1. 在您的本地化中添加一個連結:“請<a href="#">登錄</a>繼續”

  2. 多個本地化 - 要麼:

  3. “請{0}繼續”和“登錄”,或

  4. “請”、“登錄”和“繼續”

  5. 本地化中的標記,例如:

  6. “請{0}登錄{1}以繼續”

  7. “請{start-login}登錄{end-login}繼續”

  8. “請<a href="{0}">登錄</a>繼續”

  9. 只是不支持它-使整個句子成為連結

我認為有一個避免 1 的主要原因 - 你混淆了本地化和應用程序導航。

選項 2 最終會為每個文本塊提供多個資源,但只要您有管理所有本地化的好方法,這應該不是問題。但是,對於第三方翻譯人員來說,這可能會很痛苦——你需要某種方式來告訴他們上下文,否則你會得到一些非常奇怪的單個單詞的翻譯。

選項 3 是我的首選解決方案。儘管如此,您仍然會為您的翻譯人員製造問題 - 大多數人不會理解您在文本中的標記/HTML/標記。我們已經做了一些 HTML,所以 3.3 對我們有用。

選項 4 可能值得考慮 - 您是否在嵌入連結以使其值得額外的工作和維護方面獲得足夠的收益?這是特定於您的應用程序的一個重要問題:如果整個句子是連結(而不僅僅是主動動詞 - 這是連結的最佳實踐),您是否真的失去了足夠多的選項以使選項 2 或 3 值得付出額外的努力?

我認為這可能是為什麼沒有更標準化的方法來執行此操作,因為對於大多數項目(可能 10 次中有 9 次)選項 4 就足夠了,所以這只會成為某些特殊情況的問題。我們有一個複雜的應用程序,包含大約​​ 11,000 條本地化文本,絕大多數時間都使用 4 條,並且只有 4 或 5 個地方我們不得不使用 3.3

我們的技術實現與您的類似:

&lt;%= Html.Localise("Controller/Action/KeyOfTextOnPage") %&gt;

對於連結,我們有一個特定的助手:

&lt;%= Html.LocaliseLink("Controller/Action/KeyOfTextOnPage", "~/link.aspx") %&gt;
&lt;%= Html.LocaliseAction("Controller/Action/KeyOfTextOnPage", "action", "controller") %&gt;

引用自:https://stackoverflow.com/questions/1746693