Фон
В каталоге данных ICU, который указан в GitHub (обратите внимание, что вы работали в ветке выпуска, а не в основной ветке), нет файлов для en_US
ни en_UK
присутствует. В основной ветке вы можете найти файл en_GB
, который, кажется, является правильным кодом локали, а не Великобританией.
Хотя я не могу сказать, почему нет en_US
(чего я совершенно точно ожидал, как и вы), похоже, что во всех ваших тестах, в которых вы получаете «французский», вы фактически не загружаете правильный путь ICU, а потому, что этот путь не может быть найден, путь root загружен .
Вы уже доказали это, попробовав с en_foobar
. То же самое работает, если вы пытаетесь загрузить любую другую бессмысленную локаль, которая просто не существует в этом каталоге данных, и то же самое верно и для en_US
, и для en_UK
(так как они оба не существуют, как объяснено ранее).
В качестве примечания: Я думаю, что вы, возможно, неправильно поняли запасной параметр. Это происходит так, что если язык не может быть загружен, загружается запасной язык, а не то, что любые запрашиваемые вами данные будут напрямую запрашиваться у родителя.
Примеры кода
Чтобы сделать немного более понятно, о чем я говорю, вот несколько примеров.
Загрузка с бессмысленными локалями всегда загружает данные целого каталога , поэтому у вас есть доступ ко всем данным root:
$bundle = \ResourceBundle::create('stackoverflow-is-great', 'ICUDATA-lang', true);
var_dump($bundle->get('Languages')->get('fr')); // string(6) "French"
var_dump($bundle->get('Languages')->get('de')); // string(6) "German"
Загрузка под-языков из en_NZ, которые не существуют:
$bundle = \ResourceBundle::create('en_NZ', 'ICUDATA-lang', true);
var_dump($bundle->get('Languages')->get('fr')); // NULL
var_dump($bundle->get('Languages')->get('de')); // NULL
Загрузка под-языков из en_NZ, которые do существуют :
$bundle = \ResourceBundle::create('en_NZ', 'ICUDATA-lang', true);
var_dump($bundle->get('Languages')->get('mi')); // string(6) "Māori"
Короче говоря, он работает так, как ожидалось, и дает вам данные там, где они есть, и нет данных там, где их нет.
Отладка
Как я это узнал? На основе этого комментария пользователя на странице документов PHP ResourceBundle. Я добавил вывод глубины и имел очень удобную функцию отладки:
function t($rb, $depth = 0) {
foreach($rb as $k => $v) {
echo str_repeat('->', $depth);
if(is_object($v)) {
print_r($v);
var_dump($k);
t($v, ++$depth);
} else {
var_dump($k . " " . $v);
}
}
}
$rb = new ResourceBundle('en_UK', 'ICUDATA-lang', true);
var_dump($rb->get('Languages')->get('fr'));
t($rb);
Это печатает вывод (очень длинный, поэтому я не добавляю его здесь), который выглядит подозрительно как данные root.
Последнее замечание: en_GB
похоже, что здесь также есть с псевдонимом en_001 , но я не уверен в том, какой эффект.
TL; DR: Первые три локали на самом деле не существуют в наборе данных, и, следовательно, root данные загружены, en_NZ
и en_AU
работают так, как должны.