• 多国语言功能设计与实现


    多国语言功能设计与实现

    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系统中多国语言功能的设计与实现。

     
    
    
     
     
  • 相关阅读:
    关于软件生命周期以及软件过程
    尴尬!Jsp内置对象
    软件工程导论的课后作业
    Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图
    Bing Maps进阶系列四:路由功能服务(RouteService)
    Bing Maps进阶系列三:使用地图图像服务(ImageryService)
    Bing Maps进阶系列二:使用GeocodeService进行地理位置检索
    Bing Maps进阶系列一:初识Bing Maps地图服务
    在C#中实现listbox的项上下移动(winform) 标准
    C# LIstbox 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3181762.html
Copyright © 2020-2023  润新知