我的应用程序被发送给许多不同的客户,他们都希望控制应用程序显示的文本(例如,一个客户希望显示'操作已成功完成',另一个'操作已完成'和另一个' tres bien')。
因此,基本上这里的要求是允许客户通过GUI“即时”编辑这些东西
将来,我们可能希望添加“占位符”选项(即“操作{0}已完成”,其中{0}是操作的ID。)
是否有处理此问题的框架/惯例? 我猜这是一个非常常见的问题,但我无法找到任何有关它的资源。
(我正在使用ASP.Net和nHibernate作为我的ORM。)
到目前为止,我最好的想法是在db中为所有消息创建一个表,并为它实现一些管理机制
进一步的想法将得到满足。
答案 0 :(得分:1)
在SO上有很多答案。基本上没有标准的方法,它通常是数据库中的元素和标记有某种文本文件的其他元素之间的混合。 有GNU gettext,有xliff等see here for a list 除了纯粹的翻译外,还有颜色和排版等方面。盎格鲁撒克逊人喜欢圣衣服和冷色调,西班牙语国家喜欢衬线字体和温暖的颜色。 (不是我的刻板印象)等等。 非英语语言,特别是浪漫语言往往比同等的英语文本长约30%,因此布局需要灵活和测试。许多语言都是从右到左,有些语言是日语,没有空格。
继续阅读并欢迎来到雷区。
关于这个主题有几本书,但不是很好。
答案 1 :(得分:0)
为什么不使用.NET内置功能从资源程序集中读取?
因此,您可以为每种语言(或客户)处理自己的资源程序集。您可以翻译其内容,例如使用http://www.sisulizer.com/或其他第三方应用程序。然后每个客户都可以自己翻译或撰写他的文本。
亲切的问候,帕特里克
btw:http://www.sisulizer.com也可以在db中翻译数据表: - )
答案 2 :(得分:0)
好的,这是我最终得到的解决方案(不是最好的解决方案,我确定,但足够灵活以满足我的需求):
由于我的businees层中的所有操作结果无论如何都由枚举表示(例如 - EmployeeAddition.SameNameExists
或DepartmentDeletion.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是没有问题的。
它的缺点是,对于我希望能够配置的每一段文本,我必须定义一个枚举,并在需要时手动检索它们。