• 企业管理软件开发之八 多国语言功能设计与实现


    ERP软件应该实现多国语言功能。一般是英文,简体中文和繁体中文。理论上,实现两种或两种以上的语言就已经实现任意语言,但是从Window的语言和区域选项中可以看到,要完整的实现多国语言,还需要对这些特性进行定制。

    image

     

    从实现方法来上说,有两种方式:

    1  只读。语言资源呈现现到界面中,以只读的方式,用户不可修改。或是只能由开发部门修改。

    2  可修改。语言资源可以由用户定制修改。

    我倾向于使用向者。这个过程也是逐步认识的。当熟悉SR之类的资源文件(Resx)工具之后,非常迷恋这种方式。对每一个字符串资源,生成为类型的公共静态属性,调用方式相当方便。用.NET Reflector载入.NET SDK中的工具LC.EXE,可以看到这种实现。

    image

    还可以看到.NET类库System.dll也是这种方法。这是.NET框架的多语言方案。

    经过ERP开发实践之后,经常遇到的一种情况是用户要修改开发人员设计的语言资源,以更符合实际的行业情况。

    1  设计数据库表

    USE [Framework]
    GO
    /****** Object:  Table [dbo].[LanguageTranslation]    Script Date: 08/09/2013 07:44:28 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[LanguageTranslation](
        [LanguageCode] [nvarchar](1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL DEFAULT (''),
        [KeyText] [nvarchar](200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL DEFAULT (''),
        [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,
        [OwnerBranch] [nvarchar](4) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
        [SourceBranch] [nvarchar](4) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
     CONSTRAINT [PK_LanguageTranslation] PRIMARY KEY CLUSTERED 
    (
        [LanguageCode] ASC,
        [KeyText] ASC
    )WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'语言编码
    0  英语
    1  繁体中文
    2  简体中文
    ' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'LanguageTranslation', @level2type=N'COLUMN',@level2name=N'LanguageCode'
    GO
     
     

    以字符串和语言资源表示Id为主键,在生成资源时,会同时插入三笔记录,表示三种不同的语言资源。

     

    2  添加接口与实现类,对它进行读写

    namespace Foundation.InterfaceClasses
    {
        public interface ILanguageTranslationManager
        {
            LanguageTranslationEntity GetLanguageTranslation(string languageCode, string keyText);
            LanguageTranslationEntity GetLanguageTranslation(string languageCode, string keyText, IPrefetchPath2 prefetchPath);
            LanguageTranslationEntity GetLanguageTranslation(string languageCode, string keyText, IPrefetchPath2 prefetchPath, ExcludeIncludeFieldsList fieldList);
    
            EntityCollection GetLanguageTranslationCollection(IRelationPredicateBucket filterBucket);
            EntityCollection GetLanguageTranslationCollection(IRelationPredicateBucket filterBucket, ISortExpression sortExpression);
            EntityCollection GetLanguageTranslationCollection(IRelationPredicateBucket filterBucket, ISortExpression sortExpression, IPrefetchPath2 prefetchPath);
            EntityCollection GetLanguageTranslationCollection(IRelationPredicateBucket filterBucket, ISortExpression sortExpression, IPrefetchPath2 prefetchPath, ExcludeIncludeFieldsList fieldList);
    
            LanguageTranslationEntity SaveLanguageTranslation(LanguageTranslationEntity languageTranslation);
            LanguageTranslationEntity SaveLanguageTranslation(LanguageTranslationEntity languageTranslation, EntityCollectionNonGeneric  entitiesToDelete);
            void SaveLanguageTranslationCollection(EntityCollection colls);
    
            void DeleteLanguageTranslation(LanguageTranslationEntity languageTranslation);
    
            bool IsLanguageTranslationExist(string languageCode, string keyText);
    
            string GetDisplayText(string keyText, int languageCode);
        }
    }

    因为系统中涉及大量的语言资源,当系统启动时,应该把它读取到系统缓存中,而不必每次都去访问数据库。

    再设计一个Common静态类型,可以实现对语言资源翻译简单的调用封装,简化调用代码:

    public static string TranslateText(string textToTranslate)
    {
         return LanguageTranslator.TranslateText(textToTranslate);
    }
    
    public static string TranslateText(string textToTranslate, bool useChineseSymbols)
    {
         return LanguageTranslator.TranslateText(textToTranslate, useChineseSymbols);
    }
     

    3 添加翻译到系统基础类型中

    我觉得这一部分是整个多语言结构中比较重要的一部分。请看代码:

    public void TranslateForm()
    {
         OnBeforeTranslateForm();
          TranslateControl(this); 
          OnAfterTranslateForm();
    }
     

    系统一般都会有一个基础窗体类型,以实现代码重用。比如Windows Forms中的BaseForm,Web中的PageBase,我加基础窗体或页面类型中,添加TranslateForm方法,实现对界面对的Label翻译。

    接下来的工作,就是循环遍历界面中的控件,设置它的Label/Caption/Title属性,这个属性是显示到界面中的。

    if (ctrl != null)
    {
         if (ctrl is UltraTextEditor || ctrl is UltraNumericEditor || ctrl is UltraFormattedTextEditor ||
         ctrl is System.Windows.Forms.RichTextBox) 
          {
                            // do not translate text for text editor and numeric editor
           }
           else
           {
                    if (!string.IsNullOrEmpty(ctrl.Text))
                    {
                            string textToTranslate = GetTranlatedText(ctrl, "Text", ctrl.Text);
                                ctrl.Text = LanguageTranslator.TranslateText(textToTranslate);
                     }
            }
            if (ctrl.ContextMenuStrip != null) 
                    TranslateControl(ctrl.ContextMenuStrip);
    }
     

    我觉得这一部分,这个实现方法对编写ERP界面的多国语言很好的借鉴意义。

     

    4  设计界面,添加控件

    给项目添加窗体,拖拉控件到界面中,设置它的Label/Caption/Text文字内容。

    image

    默认的,我们将控件的文本部分设为标准的英语,再到运行时,如果用户对标签为更改,则调用用户的更改,否则用默认的标签文本。

     

    5  设计文本翻译和修改功能给用户

    这一部分的功能,是方便用户对语言资源进行修改。修改部分并不复杂,简单的对数据表进行修改或写入。

    image

    Display的内容,是显示到界面中的标签文本。

    比如Work Center这个词,也可以是Work Centre,两种语系的叫法不同。可以在Display中修改,让它显示为您符合您要求的语言习惯。

    这一步,以开发人员的角度来看,是实现字符串替换,将用户修改的字符串,替换自己添加上的默认字符串。

    实用工具的截图如下所示:

    image

    调用Microsoft.VisualBasic程序集的的简体繁体转化功能:

    public string ConvertGB2312(string simplifiedChinese)
    {
            return (Microsoft.VisualBasic.Strings.StrConv(simplifiedChinese, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0));
    }

     

    6  与语言区域有关的内容的定制化

    看控制面板中的内容,很完整的展示与多国语言相关的所需要做的工作内容:

    image

    简单的概括为货币符号,数字格式,日期时间三大类型。这里面要做到很细化实属不容易,没有第三方国家语言的经验,很难对它有深刻的理解。

    至此,从数据表到界面,再到实用工具,向您展示了ERP系统中多国语言功能的设计与实现。

     
  • 相关阅读:
    python 的基础 学习 第六天 基础数据类型的操作方法 字典
    python 的基础 学习 第五天 基础数据类型的操作方法
    python 的基础 学习 第四天 基础数据类型
    ASP.NET MVC 入门8、ModelState与数据验证
    ASP.NET MVC 入门7、Hellper与数据的提交与绑定
    ASP.NET MVC 入门6、TempData
    ASP.NET MVC 入门5、View与ViewData
    ASP.NET MVC 入门4、Controller与Action
    ASP.NET MVC 入门3、Routing
    ASP.NET MVC 入门2、项目的目录结构与核心的DLL
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/3181314.html
Copyright © 2020-2023  润新知