【问题标题】:configurable application texts可配置的应用程序文本
【发布时间】:2011-04-26 13:32:42
【问题描述】:

我的应用程序被发送给许多不同的客户,他们都希望控制应用程序显示的文本(例如 - 一个客户想要显示“操作成功完成”,另一个“操作完成”和另一个“特雷斯比恩)。
因此,基本上这里的要求是允许客户通过 GUI“即时”编辑这些内容。
将来,我们可能希望添加“占位符”选项(即“操作 {0} 已完成”,其中 {0} 是操作的 ID。)

是否有任何框架/惯例来处理这个问题?
我猜这是一个非常常见的问题,但我无法找到任何有关它的资源。

(我在 ORM 中使用 ASP.Net 和 nHibernate。)
到目前为止,我最好的想法是在数据库中为所有消息创建一个表,并为其实施一些管理机制。
进一步的想法将被应用。

【问题讨论】:

  • 你没有说所以我不知道你使用的是什么语言。但是,如果您查看 Symfony 1.4 和 Zend (php) 等框架,它们内置了 i18n,您可以通过阅读手册了解它们的机制是如何工作的
  • 愚蠢的我。我已经编辑了问题(asp.net c#)。我也在这里找到了一些资源-stackoverflow.com/questions/3995916/…stackoverflow.com/questions/3821778/…。我会检查一下,看看他们是否有任何东西。

标签: web-applications internationalization


【解决方案1】:

在 SO 上有很多关于这个的答案。本质上没有标准的方法,它通常是数据库中的元素和带有某种文本文件标记的其他元素之间的混合。 有 GNU gettext,有 xliff 等see here for a list 除了纯翻译外,还有颜色和排版方面。盎格鲁撒克逊人喜欢圣衬线和冷色,西班牙语国家喜欢衬线字体和暖色。 (不是我的刻板印象)等等。 非英语语言,尤其是浪漫语言往往比同等英语文本长约 30%,因此布局需要灵活且经过测试。许多语言是从右到左的,有些语言没有空格。

继续阅读,欢迎来到雷区。

关于这个主题有几本书,但不是很好。

【讨论】:

    【解决方案2】:

    为什么不使用 .NET 内置功能来读取资源程序集?

    因此,您可以为每种语言(或客户)处理自己的资源程序集。您可以翻译他们的内容,例如使用http://www.sisulizer.com/ 或其他第 3 方应用程序。然后每个客户都可以自己翻译或编写他的文本。

    亲切的问候,帕特里克

    顺便说一句:http://www.sisulizer.com 也可以翻译数据库中的数据表:-)

    【讨论】:

    • @pro- 资源程序集更难编辑,我想让管理员用户通过 Web UI 编辑文本。
    【解决方案3】:

    好的,这就是我最终得到的解决方案(我敢肯定,这不是最好的解决方案,但足够灵活,可以满足我的需求):
    由于我的业务层中的所有操作结果都由枚举表示(例如-EmployeeAddition.SameNameExistsDepartmentDeletion.DepartmentNotEmpty),因此创建一个描述与这些枚举相关的文本消息的实体类相当简单:

    public class ConfigurableText : Entity
        {
            public virtual int TextId { get; private set; }
            public virtual TextType TypeOfText { get; set; }
            public virtual int EnumValue { get; set; }
            public virtual string MainLanguageText { get; set; }
            public virtual string SecondaryLanguageText { get; set; }
            public virtual string Description { get; set; }
    
            public ConfigurableText()
            {
                TypeOfText = ConfigurableText.TextType.PassengerMessage;
                EnumValue = 0;
                Description = string.Empty;
                TextId = GetTextId(TypeOfText, EnumValue);
            }
    
            public ConfigurableText(TextType type, int enumValue,string mainLanguageText,string description) : this()
            {
                TypeOfText = type;
                EnumValue = enumValue;
                MainLanguageText = mainLanguageText;
                Description = description;
                TextId = GetTextId(TypeOfText, EnumValue);
            }
    
            public ConfigurableText(TextType type, int enumValue,string mainLanguageText, string description, string secondaryLanguageText) : this(type,enumValue,mainLanguageText,description)
            {
                SecondaryLanguageText = secondaryLanguageText;
            }
    
    
            public enum TextType
            {
                EmployeeMessage = 1,
                DepartmentDeletionMessage,
                //...
            }
    
            public static int GetTextId(TextType type, int enumValue)
            {
                return int.Parse(((int)type).ToString() + "00"
                    + enumValue.ToString() + "00");
            }
        }
    

    然后,客户端应用程序就开始了:

    var ctrl = new TextsManagementController();
     ConfigurableTextPO message = ctrl.GetText(ConfigurableText.TextType.EmployeeMessage, (int)this.Validity);
    
    MessageMainLanguage = message.MainLanguageText;
    

    由于我使用的是 nHibernate 的二级缓存,因此数据库(几乎)从未命中,因此性能不应该成为问题。
    当然,构建用于更新这些实体的 GUI 是没有问题的。

    它的缺点是,对于我希望能够配置的每一位文本,我都必须定义一个枚举,并在需要时手动检索这些值。

    【讨论】:

      猜你喜欢
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      相关资源
      最近更新 更多