2013-06-25 25 views
0

资源包我有四个属性文件加载多个区域特定的属性文件在Java

  1. Application.properties
  2. Application_fr_FR.properties
  3. Database.properties
  4. Database_fr_FR.properties

所以现在我需要多个程序国际化,所以现在我需要加载多个属性文件并从特定于语言环境的属性文件中获取值 - 键值对。为此我有一个ResourceBundleService.java

public class ResourceBundleService { 
    private static String language; 
    private static String country; 
    private static Locale currentLocale; 
    static ResourceBundle labels; 
    static { 
     labels = ResourceBundle 
       .getBundle("uday.properties.Application"); 
     labels = append(Database.properties"); 
     //** how to append existing resource bundle with new properties file? 
    } 

    public static String getLabel(String resourceIndex, Locale locale) { 
     return labels.getString(resourceIndex); 
     //How to get locale specific messages?? 
    } 
} 

希望这个问题很清楚。

回答

2

您需要拨打ResourceBundle.getBundle(baseName, locale)每次getLabel。资源包维护内部缓存,因此它不会加载所有的道具,每次文件:

public static String getLabel(String resourceIndex, Locale locale) { 
    ResourceBundle b1 = ResourceBundle.getBundle("uday.properties.Application", locale); 
    if (b1.contains(resourceIndex)) { 
     return b1.getString(resourceIndex); 
    } 
    ResourceBundle b2 = ResourceBundle.getBundle("uday.properties.Database", locale); 
    return b2.getString(resourceIndex); 
} 
+1

噢谢谢你有关内部缓存的信息,但是我怎样调用多个属性文件?????? –

+0

噢谢谢你有关内部缓存的信息,但是我如何调用多个属性文件?????? –

+0

我怀疑这是比试图在应用程序中首先找到的更好的解决方案,如果在数据库中找不到,请参阅更新 –

0

暂时使用Application_fr.properties; les Canadiens将会感恩。用Locale.setDefault(availableLocale)选择一个可用的语言环境。根区域设置属性Application.properties还应该包含语言键。你可以复制法文版。在这种情况下,您无需设置默认语言环境。

+0

如何在同一时间加载Database.properties和Application.properties,以便我可以为ResourceBundle提供一个访问点? –

+0

@EvgenlyDorofeev回答说。不要试图为所有人使用额外的地图,因为套件已经过优化。 'getLabel(String rIx,Locale,ResourceBundle ... bundles)'也可能有其用处。 –

0

让检查github此实现它的作品真的很好。它需要下面的函数命名约定:

MultiplePropertiesResourceBundle是一个抽象的基本实现,允许一个资源包从,而这些属性文件必须使用相同的名称结尾的多个属性文件合并 - 基名称为这些组合资源包。

如果你在第一次使用它,你需要实现如下抽象类MultiplePropertiesResourceBundle

import ch.dueni.util.MultiplePropertiesResourceBundle; 

public class CombinedResources extends MultiplePropertiesResourceBundle { 

    public CombinedResources() { 
     super("package_with_bundles"); 
    } 

} 

,那么你应该实现空类延伸出CombinedResources

public class CombinedResources_en extends CombinedResources {} 

等其他语言。之后,你可以使用如下的包:

ResourceBundle bundle = ResourceBundle.getBundle("CombinedResources"); 

该软件包将使用内部package_with_bundles所有属性的文件。有关更多信息,请查看github回购。