ResourceBundle 同时从 2 个 Properties 文件中读取

Posted

技术标签:

【中文标题】ResourceBundle 同时从 2 个 Properties 文件中读取【英文标题】:ResourceBundle reads from 2 Properties files at the same time 【发布时间】:2011-12-21 08:52:59 【问题描述】:

在我的项目中,我有 2 个 properties files 用于国际化。 我将ResourceBundleLocale 参数一起使用,并将属性文件中的密钥存储在一个集合中。不幸的是,在集合中存储了来自两个文件的组合键。我只想要来自单个文件的密钥,具体取决于语言环境。在我的情况下,语言环境是“bg_BG”。 属性文件是:

time_intervals.properties

time_intervals_bg.properties

这就是我阅读它们的方式:

public List<SelectItem> getTimeSpentList() 
        
        timeSpentList = new ArrayList<SelectItem>();
        
        FacesContext context = FacesContext.getCurrentInstance();

        ResourceBundle bundle = ResourceBundle.getBundle("properties.time_intervals", context.getViewRoot().getLocale());
        
        Enumeration<String> time_interval_keys = bundle.getKeys();
        
        List<String> sortedKeys = new ArrayList<String>();

        while(time_interval_keys.hasMoreElements()) 
            String key = time_interval_keys.nextElement();
            sortedKeys.add(key);
        
        
        Collections.sort(sortedKeys, new Comparator<String>() 
            
            @Override
            public int compare(String o1, String o2) 
                if (o1.charAt(1) != ' ') 
                    return -1;
                 else if (o2.charAt(1) != ' ') 
                    return 1;
                
                
                return o1.compareTo(o2); 
            
        );
        for (String key : sortedKeys) 
            timeSpentList.add(new SelectItem(key));
        
        
        if (timeSpentList == null || timeSpentList.isEmpty()) 
            timeSpentList.add(new SelectItem(""));
            return timeSpentList;
        
        return timeSpentList;
    

这里的问题是,在Enumeration&lt;String&gt; time_interval_keys 中,我在调用bundle.getKeys() 后从两个属性文件中获取组合键,但我只想要其中一个的值。请帮忙。

附:如果对我的解释和代码有任何不清楚的地方,请告诉我。

【问题讨论】:

第二个属性文件的文件名是什么?您将其列为 time_intervals_bg_properties,而不是 time_intervals_bg.properties 我的错,谢谢。 没问题。您的 face-config.xml 中是否有一个条目表明您具有受支持的语言环境 BG. 【参考方案1】:

要扩展之前的答案,您应该有一组本地化字符串的资源文件,然后是一个单独的数值文件:

time_intervals.properties:
    one_hour=1 hour

time_intervals_bg.properties:
    one_hour=1 час

time_intervals.numbers.properties:
    one_hour=1

time_intervals加载要显示的字符串,从time_intervals.numbers加载相应的数值。

编辑:或者,如果您尝试使用数值来确定要显示的字符串,则在文件中切换键和值,而忘记任何 time_intervals.numbers 文件:

time_intervals.properties:
    1=1 hour

time_intervals_bg.properties:
    1=1 час

【讨论】:

10x 的补充 :) 非常有帮助!【参考方案2】:

您没有正确使用 ResourceBundle 系统。

每个属性文件都应该包含相同的键(或者更准确地说是基本属性文件中声明的键的子集)。当您询问键的值时(或者当您像这样做一样列出键/值时),ResourceBundle 会尝试在最精确的属性文件中找到键,默认为默认属性文件。

如果属性文件中的键不同,则认为这些键是不同的。

【讨论】:

以上是关于ResourceBundle 同时从 2 个 Properties 文件中读取的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb-国际化之ResourceBundle

通过 ResourceBundle 访问属性文件时出错

Java常用类库——国际化程序(Locale,ResourceBundle以及MessageFormat处理动态文本)

ResourceBundle读取properties配置文件

ResourceBundle类:读取配置文件

ResourceBundle类读取properties文件