Как gettext обрабатывает динамический контент?

NAnt и MSBuild является самыми популярными инструментами для автоматизации сборки в .NET , и можно найти обсуждение там профессионалов/недостатков каждого в вопросе о Переполнении стека Лучший инструмент сборки.NET .

11
задан Nathan H 20 November 2009 в 20:23
поделиться

3 ответа

Лучше всего использовать функцию spritf (). Затем вы должны использовать нотацию printf для обработки динамического содержимого в ваших строках. Вот функция, которую я нашел здесь некоторое время назад, чтобы легко справиться с этим для вас:

function translate()
{
    $args = func_get_args();
    $num = func_num_args();
    $args[0] = gettext($args[0]);

    if($num <= 1)
      return $args[0];

    return call_user_func_array('sprintf', $args);

}

Теперь, например, 1, вы хотите изменить строку на:

%s poked %s

Которую вы должны ввести в функцию translate () следующим образом :

<?php echo translate('%s poked %s', $user1, $user2); ?>

Вы бы проанализировали все функции translate () с помощью poEdit. а затем переведите строку «% s poked% s» на любой желаемый язык, не изменяя строковые заполнители % s . Они будут заменены при выводе функцией translate () с user1 и user2 соответственно. Вы можете прочитать больше о sprintf () в Руководстве по PHP для более продвинутого использования.

Для проблемы №2. Вам нужно будет создать статический файл, который poEdit сможет анализировать, содержащий имена категорий. Например, "misctranslations.php":

<?php

_('Cars');
_('Trains');
_('Airplanes');

Затем пусть poEdit проанализирует misctranslations.php. Тогда вы сможете вывести перевод названия категории, используя

20
ответ дан 3 December 2019 в 03:18
поделиться

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

Я на самом деле пишу статью об этом (слишком мало времени, чтобы закончить его в любое время!) Но мой предложенный ответ идет что-то подобное:

GetText позволяет хранить номер строки, что строка появляется в коде Внутри файла .po. Если вы измените строку полностью, редактор .po узнает, что строка не новая, но это старая (благодаря номеру строки).

Мое решение для этого - написать сценарий, который считывает базу данных и создает статический файл со всеми строками GetText. Большая разница в растворе Mark заключается в том, чтобы иметь первичный ключ (позвоните IT ID) в базе данных сопоставить номер строки в новом файле. В этом случае, если вы полностью измените один оригинальный перевод, линии все еще одинаковы, и ваш переводчик мягкий будет распознавать строки.

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

Мои 2 цента.

4
ответ дан 3 December 2019 в 03:18
поделиться

@Julian

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

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

1
ответ дан 3 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: