企業管理軟件開發之八 多國語言功能設計與實現


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系統中多國語言功能的設計與實現。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM