【问题标题】:i18n asp.net mvc4 properties?i18n asp.net mvc4 属性?
【发布时间】:2013-03-16 09:57:20
【问题描述】:

我正在开发一个网站项目,我需要将该项目国际化。现在,我使用资源文件。

我已经将所有东西都国际化了,但是我想知道的一件事是:

假设我的数据库中已经有一系列类,每个类都有一个名为 Description 的字符串属性。有没有办法根据语言环境浏览器显示描述?我的意思是,我使用英文浏览器并以英文显示描述,但我将其更改为法文并以法文显示这些描述? (我想为每个描述分配一个“数字”值,然后在资源文件中有 1:人力资源,2:IT,3:医疗保健,等等。还有一个法语文件,它们各自的值,但我认为有点乱)

非常感谢

【问题讨论】:

    标签: asp.net-mvc-4 internationalization


    【解决方案1】:

    好吧,鉴于描述文本是常量,您不能将相应文本的翻译键写入数据库,然后从翻译文件中获取匹配(本地化)值吗?如果您无法更改数据库,也许只需使用数据库中的现有值作为翻译文件中的键并映射到相应的翻译。您可能必须摆脱空格等,但这应该没什么大不了的。

    在您的数据库中:

    Human Resources
    Health Care
    ...
    

    翻译文件示例:

    英语:

    Human_Resources | Human Resources
    Health_Care     | Health Care
    ...
    

    法语:

    Human_Resources | Service du personnel
    ...
    

    检索翻译后的值(伪):

    var translationKey = descriptionValueFromDB.Replace(' ', '_');
    var translatedDescription = ResourceManager.GetString(translationKey);
    

    你怎么看?

    干杯,亚历克斯

    更新: 使用标准技术在视图中显示翻译后的字符串很简单。我假设您正在使用模型对象将数据提供给您的视图。然后,您可以例如将现成的翻译写入您的模型并在视图中使用它:

        public class FooModel
        {
          public string Description {get; set;}
          public string TranslatedDescription
          {
            get { return Description.ToTranslationKey().Translate(); }
          }
        }
    
        public static class TranslationExtensions
        {
          public static string ToTranslationKey(this string term)
          {
            if (string.IsNullOrEmpty(term))
              return term;
    
            return term.Replace(' ', '_');
          }
    
          public static string Translate(this string term)
          {
            if (string.IsNullOrEmpty(term))
              return term;
    
            return ResourceManager.GetString(term);
          }
        }
    
    <div id="fooDescription">@Model.TranslatedDescription</div>
    

    当然,如果你更喜欢,你也可以将翻译部分移到视图中:

    <div id="fooDescription">@Model.Description.ToTranslationKey().Translate()</div>
    

    可以吗?

    【讨论】:

    • 我喜欢 Alex 的想法,但我不知道如何用剃须刀处理它。我能想到的唯一方法是替换控制器中的对象属性,我认为这不是一个好方法,因为我会覆盖对象。你能帮我从视图中怎么做吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多