Преобразование en_US в en-US

Я пишу приложение PHP, которое поддерживает несколько языков.

При установке локали в PHP я должен предоставить значение, определенное, как я считаю, RFC 1766 / ISO 639, согласно setlocale документация.

setlocale( LC_ALL, 'en_US' );
var_dump( setlocale( LC_MESSAGES, '0' ) );
// string(5) "en_US"

При использовании этой локали для описания HTML-атрибута lang проверка завершается ошибкой, так как он не отформатирован в соответствии с RFC 5646. Значение RFC 5646 для этого языка фактически равно en-US (обратите внимание на использование дефиса вместо подчеркивания).

Использование этого значения в функции PHP setlocale, как указано выше, приводит к следующему результату:

string(1) "C"

Я понятия не имею, почему он возвращает значение C, но я предполагаю, что это потому, что предоставленная локаль была неправильно отформатирована. C является исходным значением по умолчанию для сервера, то есть < href="https://help.ubuntu.com/community/Locale" rel="nofollow">описанный как ASCII (спасибо @Cheery за ссылку).

Вот я и думаю, что мне с этим делать. Я мог бы использовать функцию PHP str_replace для переключения - на _ перед выводом атрибута lang, например так:

<?php setlocale( 'en_US' ); ?>
<!doctype html>
<html lang="<?= str_replace( '_', '-', setlocale(LC_MESSAGES, '0') ); ?>">
...

Но я обеспокоен тем, что могут быть другие различия между спецификациями двух языков, которые могут привести к неожиданной проблеме в будущем. Если да, есть ли предпочтительный способ перевода языковых кодов, уже существующих в PHP, или класс перевода, который можно использовать?

Дополнительный вопрос: почему мой сервер по умолчанию использует значение C для локали?


person Jeff Jenkins    schedule 20.11.2014    source источник
comment
C — это одна из локалей системы. Например, help.ubuntu.com/community/Locale. C # fall-back, ASCII encoding, same as POSIX   -  person Cheery    schedule 20.11.2014


Ответы (2)


Вы должны иметь в виду, что setLocal принимает многие типы имен «локали», такие как имена и смешанные вещи, например, в (из документации php):

$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');

У вас есть 'de_DE@euro', который не является допустимым языковым кодом HTML.

Итак, во-первых, вам нужно убедиться, что он в формате lang_region, прежде чем пытаться его преобразовать.

person PhoneixS    schedule 03.11.2017
comment
Хороший вопрос @PhoneixS. Я не заметил, что дополнительные форматы не соответствуют спецификациям HTML. Вероятно, мне следует просто поддерживать словарь различных поддерживаемых типов и ссылаться на них по мере необходимости. Оцените ответ! - person Jeff Jenkins; 05.11.2017

Вы можете установить коды местных языков, используя "setlocale".

Вы можете найти здесь документацию, а также этот и другие примеры

Пример, когда они пробуют разные возможные названия локалей для немецкого языка:

<?php
/* Set locale to Dutch */
setlocale(LC_ALL, 'nld_nld');

/* Output: vrijdag 22 december 1978 */
echo strftime("%A %d %B %Y", mktime(0, 0, 0, 12, 22, 1978));

/* try different possible locale names for german as of PHP 4.3.0 */
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
echo "Preferred locale for german on this system is '$loc_de'";
?>
person Agustin Ugarte    schedule 26.11.2014
comment
Спасибо. Я знаю, что могу установить локаль с помощью setlocale в PHP. Проблема, с которой я сталкиваюсь, заключается в использовании этого атрибута HTML lang, поскольку он использует другой формат. Мне интересно, знает ли кто-нибудь о различиях между форматами, чтобы узнать, будет ли достаточно простой замены строки ('_' на '-'). - person Jeff Jenkins; 26.11.2014