Web applications 可配置应用程序文本

Web applications 可配置应用程序文本,web-applications,internationalization,Web Applications,Internationalization,我的应用程序交付给许多不同的客户,他们都希望控制应用程序显示的文本(例如,一个客户希望显示“操作已成功完成”,另一个客户希望显示“操作已完成”,另一个客户希望显示“tres bien”。 因此,这里的基本要求是允许客户通过GUI“动态”编辑这些内容。 将来,我们可能希望添加“占位符”选项(即,{0}操作已完成,{0}是操作的ID) 是否有处理此问题的框架/常规做法? 我猜这是一个非常常见的问题,但是我还没有找到关于它的任何资源 (我的ORM使用ASP.Net和nHibernate。) 到目前为止

我的应用程序交付给许多不同的客户,他们都希望控制应用程序显示的文本(例如,一个客户希望显示“操作已成功完成”,另一个客户希望显示“操作已完成”,另一个客户希望显示“tres bien”。
因此,这里的基本要求是允许客户通过GUI“动态”编辑这些内容。
将来,我们可能希望添加“占位符”选项(即,{0}操作已完成,{0}是操作的ID)

是否有处理此问题的框架/常规做法?
我猜这是一个非常常见的问题,但是我还没有找到关于它的任何资源

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

进一步的想法将会被采纳。

关于这一点,有很多答案。基本上没有标准的方法,通常是数据库中的元素和用某种文本文件标记的其他元素的混合。 有GNUgetText,有xliff等等 除了纯粹的翻译,还有色彩和排版的方面。盎格鲁撒克逊人喜欢圣衬线和冷色,西班牙语国家喜欢衬线字体和暖色。(不是我的成见)等等。 非英语语言,尤其是罗曼史语言往往比同等英语文本长30%左右,因此布局需要灵活且经过测试。许多语言是从右向左的,有些语言,比如日语,没有空格

继续阅读,欢迎来到雷区


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

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

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

你好,帕特里克


顺便说一句:还可以翻译数据库中的数据表:-)

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

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是没有问题的


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

您没有这样说,所以我不知道您使用的是什么语言。然而,如果你看看像symfony1.4和Zend(php)这样的框架,它们内置了i18n,你可以通过阅读手册ssilly me来了解它们的机制是如何工作的。我已经编辑了这个问题(asp.net c#)。另外,我在这里找到了一些资源——和。我将检查它们,看看它们是否有任何存储。@pro-资源程序集更难编辑,我希望管理员用户能够通过web UI编辑文本。