请大家帮我看一个关于获取系统当前所使用的语言的问题我的应用需要实时的获取当前系统所使用的语言
我用System.getProperty("user.language") 能够获取到系统对语言的设置。
但是,当我到控制面板里面去修改系统的语言设置后,然后我的应用程序再运行同样的代码,
获取到的语言还是控制面板里面修改之前的语言设置;
我必须退出我的应用程序,重新启动我的应用程序,读出来的语言设置才是修改之后的。不知道我表达清楚没有,我的意思是在我的应用程序不退出的情况下,我到控制面板里面去修改语言设置,
应用程序即使用System.getProperty("user.language") 去读取新的设置,但是读出来的却是修改之前的。
只有我的应用程序退出,才能读到更新之后的设置
请大家帮我看看这个问题,我很疑惑,为什么getProperty 不能根据系统的设置更新?
如果我要获取系统的最新语言设置,应该怎么办?
非常感谢!

解决方案 »

  1.   

    我试了一下,没有出现你说得问题啊, 直接就能读到更新后的user.language.
    不过我只用了一个简单的Main方法测试的public class Test { public static void main(String[] args) {
    System.out.println(System.getProperty("user.language"));
    }
    }
      

  2.   

    这个方法并不是从系统中读取你的语言设定
    System.getProperty("user.language") 
    而是从jvm的属性中去查找,当jvm运行时就获得了
    系统的各种设定,所以你在后面调用这个方法时,无论
    你怎样更改系统的属性都是没法在这个已经启动的程序中得到体现的就行你打开一个cmd窗口,然后去修改path和classpath环境变量一样
    非得重新启动一个cmd窗口才能使新的环境变量起作用
      

  3.   


      Java获得那些诸如java.version等系统属性是在Java虚拟机的环境(条件)下找的,  那是你在安装JDK的时候系统根据你所在的时区、语言等信息就已经设定好你要知道的相关信息了,  与你的操作系统的相关设定没有直接关联。
      

  4.   

     Java获得那些诸如java.version等系统属性是在Java虚拟机的环境(条件)下找的,   那是你在安装JDK的时候系统根据你所在的时区、语言等信息就已经设定好你要知道的相关信息了,   与你的操作系统的相关设定没有直接关联。
    但是,你可以试一试Timer和TimerTask类。
    [code=Java]public class JavaApp {
        
        public static void main(String[] args) {
        
         // TODO, add your application code
         Timer timer=new Timer();
         timer.schedule(new MyTask(),1,1);
        
        }
        
    }
     class MyTask extends TimerTask{
    String message=System.getProperty("user.language");
    public void run(){
    System.out.println(message);
    }
    }[code]
      

  5.   

    多谢大家的分析,我也try过上面4 楼说的用timer task 的方法,好像还是不行,在控制面板里面修改了之后,除非应用程序重新启动,读出来的语言设置才会跟着更新,否则就一直是此前的设置。不知道还有什么别的办法能获取实时地获取系统的设置。
    windows MFC里面好像就没有这样的问题,用GetUserDefaultLangID()就能永远读取当前的最新设置,想知道java里面有没有类似的function.多谢大家了。
      

  6.   

    C++就是运行在本地机器上的,所以对于系统属性的变化可以实时获得。
    JAVA是运行在JVM上,JVM运行在本地机器上,所以运行中修改本地机器的系统属性,不能反应到JVM中,
    JVM中仍然是java虚拟机启动时的设置,JAVA自然获取的仍然是旧的系统属性(相对于本地机器来说是旧的,但相对于JVM来说,这个结果是正确的,因为JAVA是运行在JVM上的)。
      

  7.   

    答:我提供楼主我的代码,保证楼主100%成功。使用基本的JDK来直接读取注册表(不用JDK1.6来读,是为了降低JDK的版本要求)
    参考代码:import java.io.*;
    import java.util.*;
    public class QueryUserLanguage {
     
      private static final String USER_LANGUAGE_CMD = "reg query " +
      "\"HKEY_LOCAL_MacHINE\\SYSTEM\\ControlSet001\\Control\\Nls\\" 
       + "Language\" /v Default";
      
      private static String trans(String code)
      {
      if(code==null) return "";
      if("0804".equals(code)) return "中文-简体";
      if("0404".equals(code)) return "中文-繁体";
      if("0409".equals(code)) return "英文-美国";
      if("1004".equals(code)) return "中文-新加坡";
      return "";
      }
      
      //获取系统的最新语言设置并返回出来如:"中文-简体"
      public static String getUserLanguage() {
        try {
          Process process = Runtime.getRuntime().exec(USER_LANGUAGE_CMD);
          StreamReader reader = new StreamReader(process.getInputStream());       reader.start();
          process.waitFor();
          reader.join();       String result = reader.getResult();
        
          int p = result.indexOf("REG_SZ");       if (p == -1)
             return null;
              
          return trans(result.substring(p + "REG_SZ".length()).trim());
        }
        catch (Exception e) {
          return null;
        }
      }  
      static class StreamReader extends Thread {
        private InputStream is;
        private StringWriter sw;    StreamReader(InputStream is) {
          this.is = is;
          sw = new StringWriter();
        }    public void run() {
          try {
            int c;
            while ((c = is.read()) != -1)
              sw.write(c);
            }
            catch (IOException e) { ; }
          }    String getResult() {
          return sw.toString();
        }
      }  public static void main(String s[]) {
      System.out.println("通过user.language来读:"+System.getProperty("user.language")) ;
      System.out.println("直接从注册表读:" 
           + getUserLanguage());
      System.out.println("等待修改当前语言环境后,程序继续读....(改好后again后按回车键)");
          Scanner sc=new Scanner(System.in);
          sc.next();
          sc.close();
          System.out.println("通过user.language来读:"+System.getProperty("user.language")) ;
      System.out.println("直接从注册表读:" 
           + getUserLanguage());
      }
    }
    程序运行结果:
    通过user.language来读:zh
    直接从注册表读:中文-简体
    等待修改当前语言环境后,程序继续读....(改好后again后按回车键)
    again
    通过user.language来读:zh
    直接从注册表读:英文-美国
      

  8.   

    经测试,使用JDK1.5可以取得更改后的语言。