Java Multiple ResourceBundles - PullRequest
       8

Java Multiple ResourceBundles

5 голосов
/ 13 апреля 2010

Я хочу загрузить несколько файлов свойств из различных пакетов как ResourceBundle. Могу ли я добиться этого в Java

Ответы [ 4 ]

3 голосов
/ 13 апреля 2010

Расширьте java.util.PropertyResourceBundle и позвоните setParent.

0 голосов
/ 01 февраля 2018

Вот моя реализация:

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());
    }
}
0 голосов
/ 09 мая 2016

Посмотрите на этот класс. У меня работает отлично! Javadoc для класса объясняет, как его использовать.

MultiplePropertiesResourceBundle (+ дочерняя компания ResourceBundleEnumeration )

Здесь вы можете найти полезные юнит-тесты a.k.a. код документации.

0 голосов
/ 01 декабря 2010

ResourceBundle.Control () управляет списком файлов для ResourceBundle. Вы можете переписать getCandidateLocales и toBundleName. toBundleName преобразует локаль в «имя файла» и список локалей, которыми вы можете управлять в getCandidateLocales. Например, как

 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);
                }
            });

Работает только в Java 1.6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...