技术开发 频道

J2ME中的字符串管理和多语言支持

  【IT168 技术文档】近期学习j2me开发,也谈谈我对字符串管理的一个方案。

  字符串管理的目的是字符串的资源化管理。

  1。这个系统应该可以通过静态方法访问;

  2。字符串保存在资源当中;

  3。可以方便的切换各种语言以达到多语言支持;

  4。字符串资源有一个名字,通过名字访问该资源;

  5。名字的规则应该是类名+内部名称。

  下一个问题就是资源以何种格式存储的问题:

  按理说xml是理想的方式,但是考虑到j2me系统的特殊性,采用plain text更为合适

  格式是string-name string-value

  name和value之间以空格或\t分割,不同的字符串之间以\n分隔。

  内部采用hashtable存储。

  通过以上的分析,可以写出如下的StringManager

  package vmlinux.app;   import java.io.*;   import java.util.*;   public class StringManager {   String lang_;   String name_;   Hashtable strings_;   boolean loaded_;   public StringManager(String lang)   {   lang_=lang;   loaded_=false;   }   public void setLang(String lang)   {   if(lang_==lang)   return;   lang_=lang;   loaded_=false;   }   public void load(String name)   {   if(name==name_ && loaded_)   return;   if(strings_==null)   strings_=new Hashtable();   else   strings_.clear();   InputStream is=this.getClass().getResourceAsStream("/strings/"+name+"."+lang_);   try   {   byte[] buf=new byte[1024];   int c=is.read(buf);   StringBuffer o=new StringBuffer();   String key=null;   do{   String data=new String(buf,0,c);   int s=0;   for(int i=0;i   {   char x=data.charAt(i);   if(s==0 && (x==' ' || x=='\t'))   {   key=o.toString();   o.delete(0,o.length());   s=1;   }   else if(s==1 && x=='\n')   {   if(key!=null && key.length()>0)   strings_.put(key,o.toString());   key=null;   o.delete(0,o.length());   s=0;   }   else   o.append(x);   }   }while((c=is.read(buf))>0);   if(key!=null && key.length()>0)   strings_.put(key,o.toString());   is.close();   }   catch(Exception ex)   {   }   name_=name;   loaded_=true;   }   public String getString(String name)   {   Object o=strings_.get(name);   if(o==null)   return name;   else   return (String)o;   }   }

  为了实现通过静态方法访问,修改一下,增加一段代码

  static StringManager instance;   public static String get(String name)   {   return instance.getString(name);   }   public static StringManager getInstance(String lang)   {   if(instance!=null)   {   instance.setLang(lang);   }   else   {   instance=new StringManager(lang);   }   return instance;   }

  并把构造函数改为private。

  有了这样一个StringManager,就可以方便的实现midlet内部的字符串管理了。

  初始化管理器: StringManager.getInstance("zh_cn").load("mystrings");//载入/strings/mystrings.zh_cn

  使用字符串: StringManager.get("TestMIDlet.Exit");//退出命令

  /strings/mystrings.zh_cn文件可以是这样的

  TestMIDlet.Exit 退出

  TestMIDlet.Done 完成

  这种设计的缺点是同一时间只能使用一个资源。

  有意见或建议请联系vmlinuxx@gmail.com,共同学习,共同提高:)

0
相关文章