我需要将本地化添加到使用一些遗留代码的网站(经典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"-->
我知道这是一种非常丑陋和陈旧的做法,但我别无选择。我的方法会更好,表现明智吗?
答案 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") %>