- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在编写现有 (Delphi) 桌面软件产品的 ASP.NET MVC 4 网络版本(使用 Razor View 引擎),目前允许客户(企业)完全自定义所有文本他们的应用程序实例,既要对其进行本地化,又要将其定制以适应他们的特定环境。
例如术语-
可能全部更改为业务中使用的个别术语。
目前,这种定制只是在存储在应用程序数据库中的文本字符串中完成,并在 Delphi 数据库中的每个表单加载时进行比较和加载。 IE。表单上的每个字符串都与数据库英语字符串进行比较,如果可用,则根据所选语言环境在表单上呈现替换。我认为这既不是可扩展的,也不是特别高效的。
我个人对本地化方法中发生的自定义想法也不太满意,应用程序中的每个字符串都可以由最终客户更改 - 这可能会导致文本一致性方面的支持问题,以及在哪里混淆说明被错误更改或未及时更新。应用程序中有许多字符串可能不应更改,除了将它们本地化为用户的区域设置 - 本地语言和/或格式约定。
我个人宁愿坚持使用 ASP.NET API 和约定来本地化应用程序的 Web 版本,使用 RESX 资源文件和资源键而不是字符串匹配。这比字符串匹配灵活得多,在字符串匹配中字符串可能具有不同的上下文或大小写并且不能简单地整体更改(有许多英语单词在不同的上下文中可能具有不同的含义,并且可能不会映射到其他含义的同一组含义语言),关键是避免了往返数据库以获取获取页面所需的字符串,并且还允许使用围绕标准 RESX 文件的大量工具轻松进行翻译。这也意味着不需要为 future 的开发人员维护或记录自定义实现。
然而,这确实给我们如何处理这些自定义术语带来了问题。
我目前认为我们应该为这些术语创建一个单独的 RESX 文件,其中列出了给定语言环境的默认值。然后我会创建一个新的数据库表,类似于
CREATE TABLE [dbo].[WEB_CUSTOM_TERMS]
(
[TERM_ID] int identity primary key,
[COMPANY_ID] int NOT NULL, -- Present for legacy reasons
[LOCALE] varchar(8) NOT NULL,
[TERM_KEY] varchar(40) NOT NULL,
[TERM] nvarchar(50) -- Intentionally short, this is to be used for single words or short phrases
);
这可能会在需要时读入 Dictionary
public static class DatabaseTerms
{
private static string DictionaryKey
{
get { return string.Format("CustomTermsDictionary-{0}", UserCulture); }
}
private static string UserCulture
{
get { return System.Threading.Thread.CurrentThread.CurrentCulture.Name; }
}
public static Dictionary<string, string> TermsDictionary
{
get
{
if (HttpContext.Current.Cache[DictionaryKey] != null)
{
var databaseTerms = HttpContext.Current.Cache[DictionaryKey] as Dictionary<string, string>;
if (databaseTerms != null)
{
return databaseTerms;
}
}
var membershipProvider = Membership.Provider as CustomMembershipProvider;
int? companyId = null;
if (membershipProvider != null)
{
companyId = CustomMembershipProvider.CompanyId;
}
using (var context = new VisionEntities())
{
var databaseTerms = (from term in context.CustomTerms
where (companyId == null || term.CompanyId == companyId) &&
(term.Locale == UserCulture)
orderby term.Key
select term).ToDictionary(t => t.Key, t => t.Text);
HttpContext.Current.Cache.Insert(DictionaryKey, databaseTerms, null, DateTime.MaxValue,
new TimeSpan(0, 30, 0), CacheItemPriority.BelowNormal, null);
return databaseTerms;
}
}
set
{
if (HttpContext.Current.Cache[DictionaryKey] != null)
{
HttpContext.Current.Cache.Remove(DictionaryKey);
}
HttpContext.Current.Cache.Insert(DictionaryKey, value, null, DateTime.Now.AddHours(8),
new TimeSpan(0, 30, 0), CacheItemPriority.BelowNormal, null);
}
}
}
然后我可以有一个公开公共(public)属性的类,返回一个基于此字典值 或 RESX 文件中的值的字符串 - 以非空者为准。像-
public static class CustomTerm
{
public static string Product
{
get
{
return (DatabaseTerms.TermsDictionary.ContainsKey("Product") ?
DatabaseTerms.TermsDictionary["Product"] : CustomTermsResources.Product);
}
}
}
然后可以根据需要使用字符串格式将它们添加到更大的本地化字符串中,或者单独用作菜单等的标签。
这种方法的主要缺点是需要提前预测最终客户可能希望定制哪些条款,但我确实认为这可能是两全其美的方式。
这看起来是一种可行的方法吗?其他开发者是如何解决这个问题的?
提前致谢。
最佳答案
我曾经设计过一个 MVC 应用程序,其中可以更改任何字符串。在我的例子中,它是为了处理其他语言,但可以想象你可以为了美观而改变任何东西。并且该系统有可能被推广到其他商店,他们可能会用不同的名字来称呼相同的东西(你说“延期付款”,我说“租赁付款”等)
警告:此解决方案与全局化和本地化无关(例如,从左到右、单词/动词顺序 - 它只需要做它所做的!)
它还考虑了美国英语 (en-US) 与英国英语 (en-GB) 与澳大利亚英语 (en-AU) 的可能性。
最后,在数据库中创建了一张Locale表:
_id _localeName _idRoot
---------------------------
1 en-GB null
2 en-US 1
3 en-AU 2
请注意 US 和 AU 如何有效地将 en-GB 作为其父级。因此,en-GB 在我们的翻译表中包含了可以在应用程序中使用的所有可以想到的字符串:
_id _idCulture _from _to
--------------------------------------
1 1 msgyes Yes
2 1 msgno No
3 1 msgcolour Colour
4 2 msgcolour Color
现在,在应用程序初始化期间,有一个指定文化的配置标志,在我的例子中恰好是 en-AU。系统查找文化树(en-AU 派生自 en-GB),并将所有翻译自下而上加载到字典缓存中。因此,任何 en-AU 的特定翻译都会覆盖 GB 的。
因此,根据您的情况进行描述 - 您的数据库中无论如何都会有所有翻译,这是您的默认设置。当客户希望自定义文本时,他们基本上会得到一个新节点(或者在我的示例中是派生的文化),然后您再次构建缓存。他们自定义的任何条款都会覆盖默认设置。您不再需要担心完成了哪些条款,它就是有效。
关于c# - 本地化与定制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17522102/
翻译 silverlight 5 应用程序 (Prism + MEF) 的可用选项是什么? 如果可能的话,我想: 没有 resx 文件(我不喜欢它们的管理方式) 而是提取并翻译 xaml 字符串(我认
我可以同时使用这两种方法来本地化 $| 还是我应该使用其中一种来支持另一种? 方法一:备份“_init_scr”中$|的旧值,并在调用“_end_win”时将$|设置回旧值。方式 2:调用 local
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C# localization , really confusing me 有人可以分享他们对大型 C# 应
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我正在使用 Phoenix 框架开发多语言应用程序 到目前为止,路由器看起来像这样: scope "/:locale", App do pipe_through [:browser, :bro
我想为我的域对象添加本地化支持。我有以下几点: class Person { int Id; City city; } class City { int Id; str
我需要 BlackBerry 本地化方面的帮助。我在 http://na.blackberry.com/eng/developers/resources/developer_labs.jsp#tab_
我正在尝试通过关注 documentation 来本地化我的 Flutter 应用程序. 我想要实现的是,在动态构建小部件的同时,我想转换来自我的模型的数据。这是我迄今为止尝试过的 List.gene
如何更改 EKEventEditViewController 中的默认语言,即使我手动设置 AppleLanguages 对象,它也始终是英语 最佳答案 我通过向我的应用程序 plist 添加一个 L
我在 iphone 日期选择器中遇到本地化问题。我希望日期选择器仅以英语显示日期,但现在它需要在 iphone 设置中设置为区域的语言。我尝试了各种没有用的方法像下面这样。 在 uidatepicke
我的应用仅支持荷兰语和法语。英语不是此应用程序的可用语言。如果我想使用可本地化的字符串,则默认值始终设置为英语。我希望这是荷兰语。所以我所做的就是使用英语可本地化字符串文件并用荷兰语单词填充它。我遇到
我即将本地化 iPhone 应用程序。当用户的语言(iOS 系统语言)是德语时,我想使用不同的 URL。 我想知道这是否是正确的方法: NSURL *url = [NSURL URLWithStrin
我正在将我的 iPhone 应用程序本地化为多种语言,除了更改一些字符串之外,我还需要更改一些背景。是否可以查询iPhone并获取用户的语言代码? 谢谢! 最佳答案 看一下 NSLocale: NSS
在本地化的 Iphone(语言设置为希伯来语)上,当我们使用 Safari 查看网页并点击输入字段时,我们会在键盘上显示希伯来语的“下一个/上一个/完成”按钮。 当我们使用应用程序中嵌入的 UIWeb
是否有更好的方法来存储大量文本以在 laravel 中进行本地化?如果我的整个页面只是纯文本,那会很容易,但是我的几个页面具有复杂的布局,我需要添加多个字符串来将文本包裹在图像/链接/媒体等内容周围。
我正在尝试将我的应用程序本地化。我为支持的语言创建了所需的 string.arb 文件。 为什么AppLocalizations.of(context)需要上下文? 我只是想访问文件/语言环境文件/类
绑定(bind)到 double可能会产生以下验证错误 Value ... could not be converted. 使用 ExceptionValidationRule 时错误更健谈: Inp
我有一些 Delphi 经验,并且正在尝试使用 Lazarus 构建一个项目,这对我来说是全新的。 我想,我已经阅读了有关 Lazarus、翻译/国际化/本地化的所有可用信息,但我无法找到我真正想要的
我一直在尝试更新网站的语言。 Controller public function getUpdateLanguage(Request $request) { $request_dat
我正在为我们正在启动的一个项目寻找框架和 CMS,该项目是一个需要支持本地化内容的网站。 Laravel 看起来不错,并且当然允许您本地化 UI 内容,但它似乎本身并不支持存储在数据库中的内容的本地化
我是一名优秀的程序员,十分优秀!