多语言网站解决方案,不使用资源文件

时间:2014-02-05 13:10:10

标签: c# asp.net

我需要将本地化添加到使用一些遗留代码的网站(经典ASP与ASP.net的混合)。遗憾的是,使用资源文件不是一个选项...

建议我这样做的方法是从数据库中提取字符串,使用简单的字典保存并缓存它:

System.Collections.Generic.Dictionary<string, string> transl

我在考虑另一种方式,为什么不创建一个从数据库加载字符串并使用字典创建文件的工具。

transl["main1"] = "Main text...";
transl["main2"] = "some moretext...";
transl["PM"]    = "Private message";

然后使用旧的

包含它
<!--#INCLUDE virtual="strings.aspx"-->

我知道这是一种非常丑陋和陈旧的做法,但我别无选择。我的方法会更好,表现明智吗?

2 个答案:

答案 0 :(得分:2)

您可以通过多种方式本地化Web应用程序,而且我曾为几家公司工作过的方式非常不同......我在专业环境中使用过的方法:

选项1:使用数据库

你可以有一个名为“翻译”的表格。在该表中,您存储了一个翻译标识符,该标识符映射到您要翻译的项目。然后,根据该标识符,您可以存储语言,翻译以及一些默认文本,以防数据库中尚不存在翻译。

示例:

Translations
(
    ID,
    TranslationID,
    Language,
    DefaultText,
    TranslatedText
)

SELECT TranslatedText, DefaultText 
FROM Translations
WHERE TranslationID = "MyTranslatableControl" AND Language = "DE-DE";

选项2:使用XSL转换

您可以将HTML标记分隔为表示层和内容层。 XSL / XSLT文件包含您的标记和一些用于绑定XML内容文件的逻辑。

然后,您可以定义几个与您的XSL文件对应的XML文件,每个文件都有自己的一组本地化。然后,这只是将正确的XML文件绑定到要显示的语言的XSL模板的情况。

答案 1 :(得分:2)

我会创建一个来自数据库的翻译列表的内存缓存(Dictionary)(将其保存在static对象中,以便它在会话中保持持久性。)

使用Session对象设置用户的语言并将其链接到翻译列表。

然后使用静态函数来获取翻译。字典访问非常快,适用于此。

public static class Translations
{
    private static Dictionary<string, Dictionary<string, string>> languageAndTranslations = ...; // load from the database in your Global_asax

    public static string GetTranslation(string key)
    {
        return languageAndTranslations[HttpContext.Current.Session["language"]][key];
    }
}

在您的页面中使用它:

<%= Translations.GetTranslation("resource_key") %>