Конвертировать 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 языки атрибут не проходит проверку, потому что он не отформатирован в RFC 5646. Значение RFC 5646 для этого языка на самом деле en-US (обратите внимание на использование дефиса вместо подчеркивания).

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

string(1) "C"

Я понятия не имею, почему он возвращает значение C, но я предполагаю, что это потому, что предоставленный языковой стандарт был неправильно отформатирован. С быть исходным сервером по умолчанию, который описывается как ASCII (спасибо @Cheery за ссылку).

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

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

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

Бонусный вопрос, почему мой сервер по умолчанию имеет значение С для локали?

3

Решение

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

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

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

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

1

Другие решения

Вы можете установить коды местных языков, используя «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'";
?>
-1

По вопросам рекламы [email protected]