簡體   English   中英

通過頁面加載以編程方式對ASPX頁面進行本地化

[英]Localization of aspx page programmatically from page load

我正在一個新項目中,嘗試遵循一些自定義規則,以查看是否可以更好地解決舊問題,但是我對此幾乎沒有疑問,我希望獲得經驗豐富的開發人員的一些反饋

我正在使用Bootstrap和jQuery開發UI層,aspx基本上會生成靜態html並進行大量的Ajax。

一個老問題是用幾種不同語言進行本地化 我正在做的是將頁面的本地化片段包裝在自定義標簽中,如下所示:

<localization culture="en" runat="server">
    <h3>Add everything...</h3>
    <p><i>Remember you can add also <a href="">by email</a> and <a href="">by gtalk</a>.</i></p>
</localization>
<localization culture="it" runat="server">
    <h3>Aggiungi tutto...</h3>
    <p><i>Ricorda che puoi farlo anche <a href="">via email</a> e <a href="">via gtalk</a>.</i></p>
</localization>

然后在我的page_load中調用一個遞歸函數:

  protected void Page_Load(object sender, EventArgs e)
  {
     Localization(Page);
  }

請執行以下操作:

  protected void Localization(Control parent)
  {
     foreach (Control c in parent.Controls)
     {
        if (c.GetType() == typeof(HtmlGenericControl))
        {
           HtmlGenericControl hgc = (HtmlGenericControl)c;
           if( hgc.TagName == "localization")
           {
              if (hgc.Attributes["culture"] != null && hgc.Attributes["culture"] != lu.ui_culture)
              {
                 c.Visible = false;
              }
           }
        }

        Localization(c);
     }
  }

我看到這種方法的一些缺點:我無法在單獨的xml文件中進行翻譯,而我正在使用遞歸函數處理html。

但同時我喜歡它,因為它使轉換帶有許多html標記的片段變得容易,而且我也可以將所有內容都放在一個位置。

過去,我使用另一種方法,即使用xslt + xml渲染html,但這也是一場噩夢,即使您成功地做到了純粹,沒有內嵌javascript,也沒有內嵌CSS看起來在一個文件中管理xml和html都很復雜。


所以我的問題是:

  1. 那是一個愚蠢的解決方案嗎?
  2. 性能明智嗎?
  3. 如何以非技術人員可以編輯翻譯文件的方式管理最動態的內容?

這不是一個愚蠢的解決方案,它看起來比進行一些可怕的xslt修改要簡單得多:)

在性能方面可以,但是最終,這完全取決於正在處理您服務器的請求數量以及它是否能夠承受負載。 如果您希望輕載(幾個用戶),則可以。

另一個解決方案是將所有翻譯存儲在數據庫中,編寫一個不錯的前端,以便翻譯人員可以維護它們,並在每個頁面請求時提取該特定頁面的所有翻譯。 表格如下所示:

tblControlTranslation(頁面名稱(nvarchar),控件名稱(nvarchar),翻譯(nvarchar))。

默認情況下,每個控件都將包含英語(因此您知道是什么),然后代碼將遍歷每個控件並將翻譯后的文本放入其中。

這似乎並不真正適合於ASP.NET的本地化模型。 為什么需要在ASPX中定義所有本地化? 您是否考慮過使用標准ASP.NET本地化工具? 考慮查看http://www.codeproject.com/Articles/38907/ASP-NET-Localization-Quick-Reference

您可以創建一個自定義資源提供程序,以從XML讀取數據。 這樣做非常簡單-我們只是編寫了一個自定義資源提供程序,該提供程序從DB讀取數據-我們需要所有最終用戶更新某些值-因此選擇DB。 對於非開發人員而言,更改XML文件相對容易-或者您可以在其之上輕松創建一個簡單的UI。 這也使您可以更輕松地管理CSS名稱的更改。

您當前使用的方法會用各種語言的翻譯來填充ASPX,並在一段時間內增加您的可維護性難題。 這種方法還會在一定程度上違反關注點分離原則,因為您的頁面在執行其正常工作和負責本地化時會過載。

您可以參考擴展ASP.NET 2.0資源提供程序模型中出色而詳細的MSDN文章以獲取更多詳細信息。 基本上,您需要實現以下類/接口並通過Web.config鏈接它們。 然后,您可以擁有頁面特定的文件或全局XML文件,可以從中讀取本地化的值。 如果需要,這也將為跨頁面共享本地化值打開大門。

ResourceProviderFactory:

namespace System.Web.Compilation
{
    public abstract class ResourceProviderFactory
    {
        public abstract IResourceProvider CreateGlobalResourceProvider(string classKey);
        public abstract IResourceProvider CreateLocalResourceProvider(string virtualPath);
    }
}

IResourceProvider:

namespace System.Web.Compilation
{
    public interface IResourceProvider
    {
        IResourceReader ResourceReader { get; }

        object GetObject(string resourceKey, CultureInfo culture);
    }
}

Web.config更改:

<system.web>
    <globalization resourceProviderFactoryType="MyCompany.Localization.CustomResourceProviderFactory" />
</system.web>

XML文件的示例XML結構-每個頁面或完整應用程序:

<LocalizedValues>
    <Value Key="FirstTextBlock">
        <LocalizedFor Culture="en-us">
            ...
        </LocalizedFor>
        <LocalizedFor Culture="it">
            ...
        </LocalizedFor>
    </Value>
</LocalizedValues>

我使用上面的遞歸函數運行了一些簡單的測試,並根據所選語言做了一些xslt替換html中的文本。 使用它上面的遞歸函數工具為0,001349秒,使用xslt則為0,006989。 盡管如此,最后我還是選擇使用xslt,然后根據所選擇的語言來緩存結果,以提高性能並能夠將所有翻譯維護在一個xml文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM