Используйте переводчик Google для перевода строки на основе printf - PullRequest
4 голосов
/ 02 августа 2010

Я пытаюсь использовать сетевой перевод Google для перевода моих английских файлов на другой язык. Они содержат символы, такие как% s и% d. Есть ли способ защитить их от ошибочного перевода.

Например, текст:

Атлет уже существует с номером% s

переводится на:

Атлет exete déjà avec nombre% s

пока я ожидаю, что оно будет переведено на:

Атлет exete déjà avec nombre% s

(Я обрабатываю ввод и вывод, чтобы я мог добавить символы вокруг него, чтобы «экранировать» строки% s и% d. Я уже думал заменить% s на какое-то слово, я уверен, что Google не будет пытаться переведите себя, но я надеюсь, что есть более хорошее решение)

Ответы [ 4 ]

3 голосов
/ 02 августа 2010

Странная идея, но ..

Замените каждый спецификатор формата уникальным числом в подчеркиваниях (или что-либо еще, сохраняемое в переводе без изменений и не мешающее использованию вами цифр), например:

Атлет уже существует с номером% s => Атлет уже существует с номером _001 _

Перевести на китайский язык: 運動員 已經 存在 的 號碼 _001_

После этого проверьте, есть ли цифры в тот же порядок после перевода, если в переводе строки формата было несколько спецификаторов формата, и если да, замените спецификатор обратно.

2 голосов
/ 13 июля 2011

Комментарий к статье о PHP для sprintf также обеспечивает изящное решение этой проблемы.

http://www.php.net/manual/en/function.sprintf.php#93552

/**
 * Converts any sprintf to a Google Translate suitable string.
 */
function _toTranslateSafeString($original)
{
    $pattern = '/(?:%%|%(?:[0-9]+\$)?[+-]?(?:[ 0]|\'.)?-?[0-9]*(?:\.[0-9]+)?[bcdeufFosxX])/';       
    $escapeString = '<span class="notranslate">$0</span>';
    return preg_replace($pattern, $escapeString, $original);
}

/**
 * Converts any Google Translate suitable string to a sprintf string.
 */
function _fromTranslateSafeString($translated)
{
    $escapePattern = '/<span class="notranslate">([^<]*)<\/span>/';
    return preg_replace($escapePattern, '$1', $translated);
}
1 голос
/ 02 августа 2010

Вы реструктурировали свою программу, чтобы использовать пакет msgcat для обработки строк? Документация для него охватывает большинство существенных моментов, в том числе, как справиться с изменяющимся порядком замены. Единственный смутный хитрость - это то, что вам нужно обрабатывать способ перемещения символов %; если объем обрабатываемого текста достаточно мал, вы можете даже сделать это вручную или с небольшой механической помощью (vi, emacs и eclipse могут выполнить требуемый тип соответствия / замены; другие редакторы, вероятно, тоже могут, но я не не используйте их).

0 голосов
/ 02 августа 2010

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

И всегда есть бета-тестеры:)

Или лучше: измените% d на произвольное целое число,% s на произвольную латинскую строку, которая не будет переведена Google (обычно используют редкое имя семьи),% d на произвольное число и т. Д.

...