如何使用ResourceBundle从Java文件中读取阿拉伯语或波斯语(密钥和值)



我正在尝试阅读阿拉伯语和波斯语键&来自Java文件的值,而不是带有ResourceBundle的属性文件,但它显示未知字符。

我所做的是我编码3个文件为: 1. labelsBundle_en_us.java 2. labelsBundle_ar_ae.java 3. labelsbundle_fa_ir.java

我的labelsbundle_en_us.java文件看起来像:

public class LabelsBundle_en_US extends ListResourceBundle{
            static final Object[][] contents = {
                                                {"REGISTER","Registration Form"},
                                                {"USERNAME","Email"},
                                                {"PASSWORD","Password"},
                                                {"CONFIRM_PASS","Confirm Password"},
                                                {"SUBMIT","Register"}
                                                };
            protected Object[][] getContents(){
            return contents;
            }   
    }//class

我的labelsbundle_fa_ir.java文件看起来像:

public class LabelsBundle_fa_IR extends ListResourceBundle{
        static final Object[][] contents = {
                                            {"REGISTER","ثبت نام"},
                                            {"USERNAME","ایمیل"},
                                            {"PASSWORD","رمز"},
                                            {"CONFIRM_PASS","مرور رمز"},
                                            {"SUBMIT","ارسال"}
                                            };
        protected Object[][] getContents(){
        return contents;
        }   
}//class

这是我的servlet:

protected void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException{      
        res.setContentType("text/html; charset=UTF-8");
        req.setCharacterEncoding("UTF-8");
        res.setCharacterEncoding("UTF-8");      
        StringWriter sWriter    = new StringWriter();  
        PrintWriter out         = new PrintWriter(sWriter);         
        String country          = req.getParameter("country");
        String language         = req.getParameter("language");
        Locale locale=null;
        if(country == null){
            locale = new Locale("en","US");
        }
        else{
            locale = new Locale(language, country);
        }       
        ResourceBundle rb = ResourceBundle.getBundle("com.i18n.resource.bundles.LabelsBundle",locale);
        req.setAttribute("resource", rb);
        out.println("<?xml version="1.0" encoding="UTF-8"?>"+
                    "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">"+
                    "<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" dir="auto">"+
                    "<head>"+
                    "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />"+
                    "<body>"+
                    "<center><h1>"+rb.getString("REGISTER")+"</h1></center>"+
                    "<table border=0 width=540 align=center>"+
                        "<tr><td colspan=2 align=center><h1>"+rb.getString("REGISTER")+"</h1></td></tr>"+
                        "<tr><td>"+rb.getString("USERNAME")+"</td><td><input type=text name=username></td></tr>"+
                        "<tr><td>"+rb.getString("PASSWORD")+"</td><td><input type=password name=password></td></tr>"+
                        "<tr><td>"+rb.getString("CONFIRM_PASS")+"</td><td><input type=password name=cPass></td></tr>"+
                        "<tr><td colspan=2 align=center><input type=submit value="+rb.getString("SUBMIT")+"></td></tr>"+
                    "</table></html>");
        res.getWriter().print(sWriter.toString());
    }//doGet

当语言为en_us时,此代码正常工作,但是当我将其更改为阿拉伯语或波斯语时,它的显示为:

ط«ط¨طھ ظ†ط§ظ…

طط±ظ…ط²
ظ…ط±ظ±±ط±ظ±…ط²ط§ط§ط±ط³ط§„

请建议

就个人而言,我认为使用listresourcebundle进行字符串没有充分的理由。但是,嘿,无论如何...

这里的问题是源.java文件的编码。

您可能将文件编码为UTF-8,但是Java编译器不知道该文件,并使用系统编码。

a。您可以将所需的编码传递给编译器,并编码:

javac -encoding utf-8 LabelsBundle_fa_IR.java

b。您可以Unicode-escape列入文件ASCII的字符串。字符将是不可读的(将是" ... u0646 ..."),但是编译器再也没有混淆了:

native2ascii -encoding utf-8 LabelsBundle_fa_IR.java asciifile
rename asciifile LabelsBundle_fa_IR.java

我假设您不会发送一个.java文件以进行本地化:-)大多数本地化工具从文件中提取可本地化的东西,将其翻译并生成Java。通常可以选择使用Unicode-escape生成它,因此无需一路走到.java并转换。

===

这是一个不好的答案:

rb.getString("USERNAME").getBytes(), "UTF-8");

getBytes取决于系统编码,但这是运行时编码。

因此,这是您的服务器的编码,而不是用于编译Java文件的使用。可能有所不同。

===

为什么我更喜欢.properties而不是listresourcebundle:

  • 本地化(由翻译人员而不是由技术)在.java文件上没有发生。必须提取字符串,然后放回原处。由于.java文件可以包含代码,而没有代码,在此过程中损坏更容易。大多数本地化工具都可以很好地处理。

  • .properties文件的编码很好地定义了:拉丁语1。没有"魔术",不取决于系统。因此,您不需要在编译时间进行特殊标志。

  • listresourceBundle非常适合特定于环境的对象。认为业务逻辑,例如使税收规则复杂化,或特殊的工作流程。这就是为什么它是从字符串到对象的地图。您当然可以将字符串放在那里,但是.properties或.xml是专为字符串而设计。

String USERNAME = new String(rb.getString("USERNAME").getBytes(), "UTF-8");     

最新更新