实现多国语言有许多种实现方案,无外乎是一种字符串替换技术,将界面控件的文本标签替换成相应语言的文字。.NET Windows Forms实现多国语言的方法有以下几种:

1 .NET的方案,使用资源文件

分别做三个语言的资源文件,比如String.resx,String.zh-cn.resx,String.zh-tw.resx,编译程序集,运行时用下面的代码设置程序的语言区域。

string languageName="zh-cn";
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(languageName)
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(languageName)

2 使用Xml格式的资源文件

创建Xml格式的资源文件,保存一种或多种语言的字符串,运行时根据用户所选的语言进行界面标签字符串替换。

例子Xml字符串文件如下:

<?xml version="1.0"?>
<configuration>
<add key="Login"   Default="Login"     zhcn="登录"         zhtw="登錄"  />
<add key="UserId"  Default="User Id"   zhcn="用户编码"     zhtw="使用者編碼"  />
</configuration>

3 数据库方案

将语言资源字符串存放在数据库中,运行时读取并替换,这是我推荐的方案。

设计语言翻译数据库表,用于存放语言翻译内容,表结构如下:

CREATE TABLE [dbo].[LanguageTranslation]
(
[LanguageCode] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[KeyText] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL CONSTRAINT,
[DisplayText] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[CreatedDate] [datetime] NULL,
[CreatedBy] [nvarchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[RevisedDate] [datetime] NULL,
[RevisedBy] [nvarchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[LanguageTranslation] ADD CONSTRAINT [PK_LanguageTranslation] PRIMARY KEY CLUSTERED  ([LanguageCode], [KeyText]) ON [PRIMARY]
GO
EXEC sp_addextendedproperty N'MS_Description', N'翻译', 'SCHEMA', N'dbo', 'TABLE', N'LanguageTranslation', NULL, NULL
GO
EXEC sp_addextendedproperty N'MS_Description', N'语言编码
0  英语
1  繁体中文
2  简体中文
', 'SCHEMA', N'dbo', 'TABLE', N'LanguageTranslation', 'COLUMN', N'LanguageCode'
GO
EXEC sp_addextendedproperty N'MS_Description', N'索引词', 'SCHEMA', N'dbo', 'TABLE', N'LanguageTranslation', 'COLUMN', N'KeyText'
GO
EXEC sp_addextendedproperty N'MS_Description', N'显示词', 'SCHEMA', N'dbo', 'TABLE', N'LanguageTranslation', 'COLUMN', N'DisplayText'
GO
EXEC sp_addextendedproperty N'MS_Description', N'创建日期', 'SCHEMA', N'dbo', 'TABLE', N'LanguageTranslation', 'COLUMN', N'CreatedDate'
GO
EXEC sp_addextendedproperty N'MS_Description', N'建立人', 'SCHEMA', N'dbo', 'TABLE', N'LanguageTranslation', 'COLUMN', N'CreatedBy'
GO
EXEC sp_addextendedproperty N'MS_Description', N'修改日期', 'SCHEMA', N'dbo', 'TABLE', N'LanguageTranslation', 'COLUMN', N'RevisedDate'
GO
EXEC sp_addextendedproperty N'MS_Description', N'修改人', 'SCHEMA', N'dbo', 'TABLE', N'LanguageTranslation', 'COLUMN', N'RevisedBy'
GO

我以Language Code和相应的字符串为主键,Language Code的值是0,1,2,分别代表英语,繁体,简体。

字符串为界面控件标签上的文字,比如User Id, Department等。

为方便编辑字符串资源,增加一个存储过程,用于增加和修改语言资源:

SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [dbo].[spAddTranslationText]
@KeyText nvarchar(200),
@EnglishText nvarchar(200),
@ChtText nvarchar(200),
@ChsText nvarchar(200)
AS
BEGINSET NOCOUNT ON;
SET @KeyText = UPPER(@KeyText)
DELETE LanguageTranslation WHERE KEYTEXT = @KeyTextINSERT LanguageTranslation (LANGUAGECODE, KEYTEXT, DISPLAYTEXT, CREATEDDATE, CREATEDBY, REVISEDDATE, REVISEDBY)
VALUES ('0', @KeyText, @EnglishText, GETDATE(), 'MIS', GETDATE(), 'MIS')INSERT LanguageTranslation (LANGUAGECODE, KEYTEXT, DISPLAYTEXT, CREATEDDATE, CREATEDBY, REVISEDDATE, REVISEDBY)
VALUES ('1', @KeyText, @ChtText, GETDATE(), 'MIS', GETDATE(), 'MIS')INSERT LanguageTranslation (LANGUAGECODE, KEYTEXT, DISPLAYTEXT, CREATEDDATE, CREATEDBY, REVISEDDATE, REVISEDBY)
VALUES ('2', @KeyText, @ChsText, GETDATE(), 'MIS', GETDATE(), 'MIS')ENDGO

为了简化简体到繁体的转化,调用.NET  VB类库中的方法,实现简体转化为繁体的功能,简体转化为繁体:

public string ConvertToTraditionalChinese(string label)
{return Strings.StrConv(label, VbStrConv.TraditionalChinese, 0);
}

基本上满足需求,转换的准确率不如Word或一些在线翻译工具。

将存储过程和语言转换的方法封装起来,做成一工具,输入要翻译的资源字符串和简体翻译,生成存储过程调用。

程序启动时,设计一个翻译资源缓存字典表,分别存放对应语言的键值对。

private static Dictionary<int, DataTable> _cachedLanguageTranslation;

以下的代码从数据库中读取翻译数据到内存中,参考

DataTable languageTable = null;
DbFunctionCall isNullDisplayText = new DbFunctionCall("ISNULL", new object[] { LanguageTranslationFields.DisplayText, string.Empty });
EntityField2 displayTextField = new EntityField2("DisplayText", isNullDisplayText);
ResultsetFields fields = new ResultsetFields(2);
fields.DefineField(LanguageTranslationFields.KeyText, 0, "KeyText");
fields.DefineField(displayTextField, 1, "DisplayText");ISortExpression sortExpression = new SortExpression(LanguageTranslationFields.KeyText | SortOperator.Ascending);using (DataAccessAdapterBase adapter = GetSystemDataAccessAdapter())
{languageTable = new FastSerializableDataTable();languageTable.RemotingFormat = SerializationFormat.Binary;IRelationPredicateBucket bucket = new RelationPredicateBucket();bucket.PredicateExpression.Add(LanguageTranslationFields.LanguageCode == languageCode);bucket.PredicateExpression.Add(displayTextField != string.Empty);bucket.PredicateExpression.Add(LanguageTranslationFields.KeyText != displayTextField);adapter.FetchTypedList(fields, languageTable, bucket, 0, sortExpression, false);

最后,设计一个公共接口方便调用:

//Shared.cs
public static string TranslateText(string textToTranslate)
{return LanguageTranslator.TranslateText(textToTranslate);
}

用数据库作为ERP多国语言实现方案有以下几个原因:

1  资源字符串可以被修改。这是最主要的原因,软件公司以程序员为主,没有实际的行业经验,不足以恰当(信,达,雅)的设计出各行业的翻译。产品发布到客户后,还可以修改资源字符串,不合理的地方以用户的经验为主。

2  资源字符串部署。以数据库表作为字符串资源的存储方式,部署时只需要发布SQL语句文件即可。

INSERT INTO [LanguageTranslation] ([LanguageCode],[KeyText],[DisplayText])
VALUES(N'0', N'-- PRODUCTION REQ --', N'')INSERT INTO [LanguageTranslation] ([LanguageCode],[KeyText],[DisplayText])
VALUES(N'0', N'-- LOC.TOTAL_QTY. --', N'')INSERT INTO [LanguageTranslation] ([LanguageCode],[KeyText],[DisplayText])
VALUES(N'0', N'-- LOC TOTAL_QTY. --', N'')INSERT INTO [LanguageTranslation] ([LanguageCode],[KeyText],[DisplayText])
VALUES(N'0', N'--- JOB ---', N'')INSERT INTO [LanguageTranslation] ([LanguageCode],[KeyText],[DisplayText])
VALUES(N'0', N' DR ', N'')INSERT INTO [LanguageTranslation] ([LanguageCode],[KeyText],[DisplayText])
VALUES(N'0', N' DISC. ALLOWED ', N'')INSERT INTO [LanguageTranslation] ([LanguageCode],[KeyText],[DisplayText])
VALUES(N'0', N'-------------- DEMAND --------------', N'')

写完了多国语言实现方案,意犹未尽,去Google上搜索一下stackoverflow提供的解决方案,地址是

http://stackoverflow.com/questions/373388/best-way-to-implement-multi-language-globalization-in-large-net-project

http://stackoverflow.com/questions/119568/best-practice-to-make-a-multi-language-application-in-c-winforms

这篇问答中提到几个工具,这几个工具的网站都可以打开,读者若是在寻找多国语言方案,可实际操作体会一下。

Sisulizer   http://www.sisulizer.com/

WPF LocalizationExtension  http://wpflocalizeextension.codeplex.com/

GetText http://gnuwin32.sourceforge.net/packages/gettext.htm

DBResource Provider  http://www.west-wind.com/presentations/wwDbResourceProvider/

解析大型.NET ERP系统 多国语言实现相关推荐

  1. 解析大型.NET ERP系统:十三种界面设计模式

    成熟的ERP系统的界面应该都是从模板中拷贝出来的,各类功能的界面有规律可遵循.软件界面设计模式化或是艺术性的创作,我认可前者,模式化的界面客户容易举一反三,降低学习门槛.除了一些小部分的功能界面设计特 ...

  2. 解析大型.NET ERP系统架构设计 Framework+ Application 设计模式

    我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应该具备良好的可扩展性和可维护性,系统中的功能紧密关联.除去业务上的复杂性,如何设计这样的一个协 ...

  3. 解析大型.NET ERP系统 设计异常处理模块

    异常处理模块是大型系统必备的一个组件,精心设计的异常处理模块可提高系统的健壮性.下面从我理解的角度,谈谈异常处理的方方面面.我的设计仅仅限定于Windows Forms,供参考. 1 定义异常类型 . ...

  4. 解析大型.NET ERP系统 20条数据库设计规范

    数据库设计规范是个技术含量相对低的话题,只需要对标准和规范的坚持即可做到.当系统越来越庞大,严格控制数据库的设计人员,并且有一份规范书供执行参考.在程序框架中,也有一份强制性的约定,当不遵守规范时报错 ...

  5. 解析大型.NET ERP系统 高质量.NET代码设计模式

    1 缓存 Cache 系统中大量的用到缓存设计模式,对系统登入之后不变的数据进行缓存,不从数据库中直接读取.耗费一些内存,相比从SQL Server中再次读取数据要划算得多.缓存的基本设计模式参考下面 ...

  6. 解析大型.NET ERP系统 设计通用Microsoft Excel导入功能

    做企业管理软件很难避免与Microsoft Excel打交道,常常是软件做好了,客户要求说再做一个Excel导入功能.导入Excel数据的功能的难度不大,从Excel列数据栏位的取值,验证值,再导入到 ...

  7. ERP系统重新打开订单的后台限制解析

    作为一个系统分析师,给出一个业务然后进行分析,将各种可能遇到的情况尽量的列举出来,这是基本素质之一.这不但需要系统分析师有比较严谨的思维,而且还 要求其有很丰富的工作经验.假设现在用户有一个" ...

  8. (2)esp8266多国语言翻译系统

    http://bbs.mydigit.cn/simple/?t2649513.html 这个想法不错 原来只是想用esp8266搞一个百度的多国语言翻译系统出来的,只是为了尝试如何调用各种web ap ...

  9. ERP系统模块完全解析──工作中心

    ERP系统模块完全解析──工作中心 1.工作中心简介   工作中心(Working Center)是直接的生产加工部门.工作中心有明确的生产场地,是生产加工单元的统称.如一条流水线,CNC加工机床等. ...

最新文章

  1. 了解HTML 元素分类
  2. Android Studio 3.0+ Record Espresso Test 自动化测试
  3. 详解BAT盘根错节的O2O矩阵格局
  4. java 带参数的构造函数_java – mockito模拟一个带参数的构造函数
  5. tbb flow graph node types
  6. 课后作业一 小九九 课后作业二 任意一个数在此范围被七整除的个数...
  7. 七夕-探探小卡片鸿蒙版
  8. 利用 ILSpy 查看 C# 代码编译及运行真相
  9. 定时 监控 shell 服务宕机自动重启,并发送短信通知
  10. 【渝粤题库】陕西师范大学202131组织行为学作业(高起本、专升本)
  11. MyBatis第一天课堂笔记
  12. Doxygen、hhc生成chm格式文档
  13. 设置电子围栏 高德地图_Android 高德地图的使用, 根据手势拖动绘制电子围栏
  14. FPGA--ZCU106通过SFP+/SGMII模块传输数据-第二讲(全网唯一)
  15. 基于用户的音乐推荐平台
  16. 制造业大量招程序员,是拧螺丝吗?
  17. Java 实现回文数
  18. 安装PS时提示安装程序检测到计算机重新启动操作可能处于挂起状态,建议您退出安装...
  19. Red Hat 镜像下载
  20. 让弹幕飞一会儿——腾讯视频弹幕(39W+)爬取实战

热门文章

  1. Android之ListActivity(一):布局与数据绑定
  2. C进阶 - 内存四驱模型
  3. Java中各种集合特点总结
  4. 阿里云centos配置nginx和nodejs
  5. 数据结构笔记--二叉查找树概述以及java代码实现
  6. “微信应用号对行业影响”之一,app开发速来围观
  7. poj 3662 Telephone Lines spfa算法灵活运用
  8. CBA 赛程的笔记 - 北京首钢
  9. [leetcode]Surrounded Regions @ Python
  10. 私有云管理-Windows Azure Pack