多语言开发最佳实践,让软件的界面支持多国语言,怎么样做才最好?

今天发现一个好东西, 马上想到年初的时候带团队做项目,要求UI界面支持中英双语的问题,当时考查了几种方法,都不理想,不管是写在XML里还是资源文件里,最主要的问题是都要在程序中对要获取的资源字符串使用 string 进行硬编码,比如 GetString("Message") 。考虑到项目的规模比较大,开发维护周期都会比较长,这种办法怕后期会失控,以 string 做为参数的话,不管写错写漏,都没有办法检查代码,资源文件经过多次修订之后,会比较混乱,是否还能和代码正确对应完全不能保证,也不敢去删改,因为根本不知道是不是哪里还在用。

 

 

Resource资源文件本身并不能提供多国语言的解决方案,只是存储数据,多个语言资源文件是没办法直接强类型点出来的,因为它们都是各自独立的类型,需要借助ResouceManager,传string进行来取资源,而XML来存储也不能避免这个问题。

 

当时小组在这个问题上纠结了将近一周,一直没有找到好的解决办法,我们后来讨论提出的思路是用接口把不同语种的资源文件统一起来,让语言资源实现统一的接口,程序中使用接口来调用资源字符串,但当时没能实现。

 

这个工具,就是专门用来辅助多国语言支持的开发工作的:SE String Resouce。

以接口作为多语言资源的协定,来实现多国语言支持,并且可以对多国语言资源进行统一的维护,管理。 

 

 

 

这款软件专门用来辅助多国语言的开发和实现,他使用的方法就是我们之前想的,把多种语言资源文件统一起来,抽像出接口,然后在接口的基础上实现。

使用非常容易,不比 Excel 复杂多少,上图中的 Name 列,就是生成代码时的接口属性(Property),后面跟着的是语言,可以添加任意多种语言,最后一列是注释,注释也可以生成到代码里。

 

 

 

生成代码时,首先根据当前的语言资源,生成一个接口(Interface),然后再生成相对应的.net资源文件和对应的类,资源文件类都会继承实现语言资源总的接口,除此之外,生成一个主要类,主要类用来管理和调用当前的语言资源。

这个程序最大的特点就是抽像不同语言资源,使使用者能够以面向接口的方式调用资源,使多国语言项目能够在资源访问这一块保持比较高的健壮性和可维护性。
 

主要类的代码如下,不过一般不用再去修改,拿来用就可以,整个方案我试着做下来,还是相当简单和容易的,非常的高效。  

 

public class Current {
        
        
private static ILanguage _Language;
        
        
/// <summary>
        
///  Call GetLanguages() to retrieve a list of possible languages that can be used to set this property.
        
///  The default value is the default language.
        
/// </summary>
        public static ILanguage Language {
            
get {
                
if ((_Language == null)) {
                    System.Collections.Generic.List<ILanguage> list = Current.GetLanguages();
                    
for (int i = 0; (i < list.Count); i = (i + 1)) {
                        
if (list[i].IsDefault) {
                            _Language = list[i];
                            
return _Language;
                        }
                    }
                }
                
return _Language;
            }
            
set {
                _Language = value;
            }
        }
        
        
/// <summary>
        
///  Gets a list of available languages defined in this assembly.
        
/// </summary>
        public static System.Collections.Generic.List<ILanguage> GetLanguages() {
            System.Collections.Generic.List<ILanguage> items = new System.Collections.Generic.List<ILanguage>();
            System.Type[] exportedTypes = System.Reflection.Assembly.GetExecutingAssembly().GetExportedTypes();
            
for (int i = 0; (i < exportedTypes.Length); i = (i + 1)) {
                
if (exportedTypes[i].IsClass) {
                    
if ((exportedTypes[i].GetInterface("ILanguage"!= null)) {
                        
try {
                            
object obj = System.Activator.CreateInstance(exportedTypes[i]);
                            ILanguage interfaceReference = ((ILanguage)(obj));
                            
if ((interfaceReference != null)) {
                                items.Add(interfaceReference);
                            }
                        }
                        
catch (System.Exception ) {
                        }
                    }
                }
            }
            
return items;
        }
    }

 

 

 

下载地址: http://sailingease.com/ssr/download.htm

posted @ 2010-07-13 17:33  rob_2010  阅读(1084)  评论(0)    收藏  举报