Подтвердить что ты не робот

Самый эффективный способ сделать языковой файл в PHP?

Вопросы Обновлено вместо того, чтобы задавать новый вопрос...

Я действительно хочу предоставить несколько альтернативных языков, кроме английского на моем сайте социальной сети, который я создаю, это будет мой первый раз, когда я буду делать какой-либо перевод на языке, поэтому, пожалуйста, несите меня. Я изучаю так, что я все ухо и открыт для идей, и у меня много уже здесь есть вопросы.

1)
Что означает i18n, я часто вижу это при исследовании перевода языка на SO?

2)
Большинство людей говорят, что используйте gettext PHP имеет расширение или поддержку для него,
хорошо я изучал его, и у меня есть базовое понимание этого, насколько я могу судить, это много дополнительной работы, чтобы пойти по этому маршруту,
Я имею в виду кодирование моего сайта для использования его функций, т.е. _ ('hello world i'm in English for now') или еще gettext ( "hello world i'm in English for now" ) не проблема, как любой маршрут Я пойду, это потребует.
Но тогда вам нужно установить gettext на свой сервер и заставить его работать,
а затем использовать некоторые специальные редакторы для создания специальных файлов и скомпилировать их, я думаю?

Звучит как боль, я понимаю, что это лучший путь, хотя все, кажется, говорят, что это так. Так может кто-нибудь сказать мне, почему это маршрут?

3)
Мне очень нравится простота этого подхода, просто построение языкового массива и вызов фраз, который вам нужен, в функции, подобной приведенному ниже примеру  , вы должны просто включить файл с соответствующим языковым массивом.

То, что я действительно хочу знать, это будет менее эффективный метод производительности на высоком трафике и довольно большом сайте по сравнению с использованием gettext, и если да, то можете ли вы объяснить, почему?

<?PHP
//Have seperate language files for each language I add, this would be english file
function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\ available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}
//Then in application where there is text from the site and not from users I would do something like this
echo lang('NO_PHOTO');  // No photo available would show here
?>

* некоторый код, используемый из ответа brianreavis ниже

4b9b3361

Ответ 1

Не изобретайте велосипед. Используйте, например, gettext или Zend_Translate.

Ответ 2

Вероятно, лучше всего определить функцию, которая обрабатывает ваше языковое сопоставление. Таким образом, если вы хотите изменить, как это работает позже, вы не будете вынуждены тратить сотни скриптов на случаи, когда вы использовали $lang[...] и заменяли их чем-то другим.

Что-то вроде этого будет работать и будет хорошо и быстро:

function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\ available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}

Сделать уверенным массив объявлен static внутри функции, чтобы он не перераспределялся каждый раз при вызове функции. Это особенно важно, когда $lang действительно большой.

Чтобы использовать его:

echo lang('NO_PHOTO');

Для работы с несколькими языками просто установите эту функцию в нескольких файлах (например, en.php, fr.php и т.д.) и require() для пользователя.

Ответ 3

Это может работать лучше:

function _L($phrase){
static $_L = array(
    'NO_PHOTO' => 'No photo\ available',
    'NEW_MEMBER' => 'This user is new'
);

     return (!array_key_exists($phrase,$_L)) ? $phrase : $_L[$phrase];
}

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

Следует отметить, что массив может содержать не более ~ 65500 элементов. Должно быть достаточно, но хорошо, просто говоря.

Вот код, который я использую для проверки языка пользователя:

<?php
function setSessionLanguageToDefault() {
    $ip=$_SERVER['REMOTE_ADDR'];
    $url='http://api.hostip.info/get_html.php?ip='.$ip;
    $data=file_get_contents($url);
    $s=explode (':',$data);
    $s2=explode('(',$s[1]);

    $country=str_replace(')','',substr($s2[1], 0, 3));

    if ($country=='us') {
        $country='en';
    }

    $country=strtolower(ereg_replace("[^A-Za-z0-9]", "", $country ));
    $_SESSION["_LANGUAGE"]=$country;
}

if (!isset($_SESSION["_LANGUAGE"])) {
    setSessionLanguageToDefault();
}

if (file_exists(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php')) {
    include(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php');
} else {
    include(APP_DIR.'/language/'.DEFAULT_LANG.'.php');
}

?>

Его еще не сделано, но я думаю, что это может многое помочь.

Ответ 4

Не создавайте свой собственный язык. Используйте gettext. PHP имеет стандартные привязки, которые вы можете установить.

Ответ 5

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

1) I18n не подходит для интернационализации и имеет некоторое сходство с I-восемнадцатью годами.

2) По моему честному мнению gettext - пустая трата времени.

3) Ваш подход выглядит хорошо. Вы должны искать языковые переменные. WoltLab Community Framework 2.0 реализует двухстороннюю языковую систему. На данный момент существуют языковые переменные, которые сохраняются в базе данных, а внутри шаблона используется только имя переменной, которое затем будет заменено содержимым переменной на текущем языке (если доступно). Вторая часть системы обеспечивает способ сохранения созданного пользователем контента на нескольких языках (требуется ввод на нескольких языках).

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

Структура WCF печально, так что повторное использование кода вне рамки очень сложно, но вы можете использовать его как вдохновение. Объем системы зависит исключительно от того, чего вы хотите достичь на своем сайте. Если он будет большим, вы должны обязательно взглянуть на систему WCF. Если это небольшое количество выделенных языковых файлов (de.php, en.php и т.д.), Из которых будет добавлен правильный для текущего языка.

Ответ 6

К сожалению, gettext не работает хорошо и имеет проблемы в различной ситуации, например, на разных ОС (Windows или Linux) и делает работу очень сложной.

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

Если разработчик хочет просто получить перевод текста, он должен установить только путь к файлу .mo и получить перевод с помощью одной функции, такой как translate ( "hello", "en_EN" ); С gettext это невозможно.

Ответ 7

почему бы вам просто не сделать это как многодисковый массив... например, этот

<?php

$lang = array(
    'EN'=> array(
        'NO_PHOTO'=>'No photo\ avaiable',
        'NEW_MEMBER'=>'This user is new',
    ),
    'MY'=> array(
        'NO_PHOTO'=>'Tiada gambar',
        'NEW_MEMBER'=>'Ini adalah pengguna baru',
    )
);

?>