2010-04-13 9 views

Trả lời

3

Kéo dài java.util.PropertyResourceBundle và gọi setParent.

+0

tin lớp ParentResourceHoleder kéo dài ResourceBundle { \t \t @ Override \t Enumeration công getKeys() { \t \t // TODO phương pháp tự động tạo ra còn sơ khai \t \t trả về null; \t} \t @ Override \t bảo vệ Object handleGetObject (String key) { \t \t // TODO phương pháp tự động tạo còn sơ khai \t \t trở lại null; \t} \t \t @ Override \t protected void setParent (ResourceBundle mẹ) { \t \t super.setParent (mẹ); } } java.util.MissingResourceException: Không thể tìm tài nguyên cho gói java.util.PropertyResourceBundle, khóa đầu vào.error – Nrusingha

+0

Um, 'mở rộng java.util.PropertyResourceBundle'. –

+0

http://stackoverflow.com/a/4615268/823282 có thể đây là những gì bạn muốn, nhưng không biết bạn muốn nó – activedecay

0

ResourceBundle.Control() kiểm soát danh sách tệp cho ResourceBundle. Bạn có thể ghi đè getCandidateLocales và toBundleName. toBundleName chuyển đổi miền địa phương thành "tên tệp" và danh sách các ngôn ngữ bạn có thể kiểm soát trong getCandidateLocales. Ví dụ như

final String[] variants = new String[]{"your names"}; 
ResourceBundle.getBundle(baseName, locale, 
      new ResourceBundle.Control() { 
       public List<Locale> getCandidateLocales(String baseName, Locale locale) { 

         List<Locale> out = new ArrayList<Locale>(); 
         String language = locale.getLanguage(); 
         String country = locale.getCountry(); 

         for (String variant : variants) { 
          out.add(new Locale(language, country, variant)); 
         } 
         out.addAll(super.getCandidateLocales(baseName, locale)); 
         return out; 
       } 

       public String toBundleName(String baseName, Locale locale) { 
         Locale l = new Locale(locale.getLanguage(), locale.getCountry()); 
         return locale.getVariant() + "." + super.toBundleName(baseName, l); 
       } 
      }); 

Nó chỉ hoạt động trong Java 1.6

0

Đây là triển khai thực hiện của tôi:

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Enumeration; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Locale; 
import java.util.Map; 
import java.util.ResourceBundle; 

public class CombinedResourceBundle extends ResourceBundle 
{ 
    private Map<String, String> combinedResources = new HashMap<>(); 
    private List<String> bundleNames; 
    private Locale locale; 
    private Control control; 

    public CombinedResourceBundle(List<String> bundleNames, Locale locale, Control control) 
    { 
     this.bundleNames = bundleNames; 
     this.locale = locale; 
     this.control = control; 
    } 

    public void load() 
    { 
     bundleNames.forEach(bundleName -> 
     { 
      ResourceBundle bundle = ResourceBundle.getBundle(bundleName, locale, control); 
      Enumeration<String> keysEnumeration = bundle.getKeys(); 
      ArrayList<String> keysList = Collections.list(keysEnumeration); 
      keysList.forEach(key -> combinedResources.put(key, bundle.getString(key))); 
     }); 
    } 

    @Override 
    public Object handleGetObject(String key) 
    { 
     return combinedResources.get(key); 
    } 

    @Override 
    public Enumeration<String> getKeys() 
    { 
     return Collections.enumeration(combinedResources.keySet()); 
    } 
}