ResourceBundle - наследование файлов свойств - PullRequest
0 голосов
/ 26 апреля 2019

Я настраиваю ResourceBundle и получаю странные результаты, которые противоречат документации Oracle.https://docs.oracle.com/cd/E23095_01/Platform.93/ATGProgGuide/html/s1804resourcebundleinheritance01.html

У меня есть 3 файла:

Animals_fr.properties

name=animals_fr

Animals_en.propertis

name=animals_en
age=5

Animals.properties

name=animals
age=0

Тогда у меня есть код:

Locale localeFr = new Locale("fr");
Locale.setDefault(new Locale("en","US"));
ResourceBundle b = ResourceBundle.getBundle("Animals", localeFr);
System.out.println(b.getString("name"));
System.out.println(b.getString("age"));

В зависимости от документации Oracle наследование должно быть таким:

Animals_fr - locale bundle
Animals_en - default locale bundle
Animals - default bundle

, а результат должен быть:

animals_fr
5

Но я получаю результат:

animals_fr
0

Есть идеи, что не так?

Спасибо

1 Ответ

1 голос
/ 29 апреля 2019

В документе, который вы связали, описывается способ поиска пакета ресурсов, а не способ разрешения отдельного ключа ресурса.

Это соответствует документированному поведению по умолчанию ,который говорит

Если язык, сценарий, страна и вариант указанного языкового стандарта - все пустые строки, то базовое имя является единственным именем пакета кандидата.В противном случае список кандидатов на локали генерируется из значений атрибутов указанной локали (язык, сценарий, страна и вариант) и добавляется к базовому имени.

, который описывает, как отдельный Localeприводит к последовательности имен кандидатов.В вашем случае это будет просто [ Animal_Fr ].Затем он говорит:

Это продолжается до тех пор, пока не будет создан экземпляр пакета ресурсов или не будет исчерпан список имен пакетов кандидатов.Если соответствующий пакет ресурсов не найден, вызывается метод getFallbackLocale элемента управления по умолчанию, который возвращает текущую локаль по умолчанию.Новая последовательность имен кандидатов в локали генерируется с использованием этой локали и снова выполняется поиск, как указано выше.

Таким образом, если Animal_Fr не существует, он возвращается к локали по умолчанию, пытаясь с помощьюпоследовательность-кандидат [ Animals_en_US, Animals_en ].

Но поскольку Animal_Fr существует и может быть создан, этот поиск не будет продолжен.Скорее, для поиска конкретного ключа ресурса цепочка становится релевантной, что задокументировано как:

После того, как найден пакет результирующего ресурса, создается его родительская цепочка .Если у результирующего пакета уже есть родительский элемент (возможно, потому что он был возвращен из кэша), цепочка завершена.

В противном случае getBundle проверяет остаток списка локалей-кандидатов, который использовался во время сгенерированного проходарезультирующий пакет ресурсов.[…] Когда дело доходит до конца списка кандидатов, оно пытается использовать простое имя пакета.С каждым из возможных имен пакетов он пытается создать экземпляр пакета ресурсов […].

Каждый раз, когда это удается, он вызывает метод setParent ранее созданного пакета ресурсов с новым пакетом ресурсов.,Это продолжается до тех пор, пока список имен не будет исчерпан или текущий пакет уже будет иметь ненулевой родительский элемент.

Таким образом, связанный документ прав относительно общего поведения getBundle, которое является результатомдвухступенчатый процесс, описанный в документации.Но когда дело доходит до родительской цепочки, которая имеет отношение к поведению getString, будет использоваться только список кандидатов текущей фазы поиска.

Итак, в зависимости от того, какойфактические пакеты действительно существуют, в вашем примере настройки может быть

Animals_fr ‣ Animals

или

Animals_en_US ‣ Animals_en ‣ Animals

.

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