Рейтинг:2

Перевод мультиязычного сайта на английский язык

флаг sa

Примечание. Этот вопрос касается только строк внутри исходных файлов (файлов PHP).

Когда вы создаете сайт Drupal в неанглоязычной стране (скажем, во Франции), вы создаете все свои PHP-файлы с французскими строками внутри.

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

До этого момента все в порядке.

Теперь ваш клиент хочет, чтобы сайт также был переведен на английский язык.

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

Это означает, что для обработки этого факта я должен:

  1. Извлеките файлы PO для перевода на французский язык.

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

  3. Восстановить языки файла PO, созданного на шаге 1 (исходный язык становится целевым языком и наоборот)

  4. Импортируйте восстановленный файл, созданный на шаге 3, на сайт.

Если вы думаете, что я совершенно не прав в этом процессе, не стесняйтесь объяснить мне, почему. Самый сложный шаг — шаг 2: знаете ли вы плавный процесс или хороший инструмент для его обработки?

Я предполагаю, что найду что-нибудь для шага 3, но любая идея приветствуется.

Sohail avatar
флаг ru
Лучше всего с первого шага всегда считать строки в вашем коде английскими, а затем переводить их на ваш основной язык, скажем, на французский. но да, если бы я был на вашем месте, я бы поменял свои строки на «английский» и продолжил оттуда
apaderno avatar
флаг us
Система перевода Drupal работает, когда исходная строка на английском языке.Если я вызову `t()` как `t('Sì, questa è una frase in italiano.")`, строка не будет переведена, потому что ни одна из исходных строк не будет содержать фразы, отличные от английского.
Baud avatar
флаг sa
@Sohail: клиент не хочет платить за перевод на английский язык, если он ему не нужен... Но вы правы... лучшая практика! Любая идея для процесса замены строк в файлах php?
Baud avatar
флаг sa
@apaderno: он работает хорошо, пока вы не добавите английский в качестве дополнительного языка сайта. До этого момента вы можете сделать t("une фраза en français"), это будет хорошо работать
apaderno avatar
флаг us
Да, но потому что он возвращает ту же строку, которую вы передали в `t()`, когда перевод не найден. Ясно, что он не находит перевода для «une фраза en français», потому что *une фраза en français* не является английским предложением. Это не перевод.
apaderno avatar
флаг us
`t()` всегда переводит с английского на язык, установленный по умолчанию с сайта, язык, установленный пользователями в качестве своего языка, или язык, установленный для узла. Например, он не переводится с итальянского на голландский или с французского на английский. Это задокументировано в [`t()`](https://api.drupal.org/api/drupal/core%21includes%21bootstrap.inc/function/t/8.9.x). ***string $string**: строка, содержащая английский текст для перевода.*
Baud avatar
флаг sa
@apaderno вы правы, но вы можете понять, что клиент не хочет платить за перевод французского сайта на английский только за то, чтобы исходный файл был на английском языке (при условии, что ему не нужен сайт на английском языке). Если вы согласны с это, вы можете понять, где я.
apaderno avatar
флаг us
Вам не нужно переводить сайт с французского на английский: все модули используют строки на английском языке, поэтому сайт уже «переведен» на английский язык. Если кто-то передает в `t()` строку на французском языке, это "вина" этого человека.
Baud avatar
флаг sa
@apaderno: нет, мне нужно это перевести, так как у меня есть несколько пользовательских модулей с тысячами французских строк...
apaderno avatar
флаг us
Отредактируйте строки, которые эти модули передают в `t()`, чтобы они содержали английские фразы, и сайт будет отображаться на английском языке, если английский установлен в качестве языка по умолчанию.
Рейтинг:1
флаг ru

As mentioned in the comments, Always start with English string and translate that even if it's a one language only website, to ease the pain here's what I always do to keep the strings and translations contained to the theme itself:

open your THEMENAME.info.yml file and add the following:

'interface translation project': THEMENAME
'interface translation server pattern': 'themes/custom/THEMENAME/translations/%language.po'

then create a translations directory within your theme and there you can add your translation .po files, eg. fr.po for french or nb.po for Norwegian

This is the syntax you need to have within your .po file:

msgid "Hello World"
msgstr "Bonjour le monde"

So whenever you write Hello World string in a t() function or as a filter in twig file like so: {{ Hello World|t }} it would know to import the translations from there

But how to trigger the translation import?

drush locale:check - not necessary, but checks if there are any new strings added

drush locale:update - Imports the translations and you're done

Note that you can add/run this to your deployment procedure as well and make your life easier, no need for UI translation, just add your string to your .po file whenever you write hardcoded string into your files

Update: Didn't even notice we are talking Drupal 7, this refers to Drupal 8 for future readers

Baud avatar
флаг sa
Я вознаградил ваш ответ, даже если он не отвечает на мой вопрос, потому что я многому научился из него.
Sohail avatar
флаг ru
Спасибо, даже не заметил, что мы говорим о Drupal 7, это относится к Drupal 8
Рейтинг:1
флаг de

It is indeed best practice to have the strings in your code being written in English (I will not discuss that point).

Yet, I had a similar issue once with a website (Drupal 7) a colleague of mine developed. The customer initially wanted to have the website in NL and FR and only many years later decided to add an EN version.

Problem: Strings in the code were a mix of NL and FR...

The workaround I found was to activate the "English, British" language (and deactivate the "English" core language since default language was NL). That way, all your strings can be translated into en-gb from the interface translation or from import of a .po file.

In Drupal 8/9, it is even easier as there is a box labelled "Enable interface translation to English" on page admin/config/regional/language/edit/en.

Baud avatar
флаг sa
На данный момент это лучшая попытка ответить на мой вопрос... Я очень доволен новой функцией Drupal 8/9 (к сожалению, это сайт D7). Я думаю, что не буду использовать этот трюк, потому что у меня есть много другого контента, уже переведенного на английский (Node и т. д.). Я боюсь конвертировать все это в EN-GB... Но, спасибо, это хороший совет. (Я наградил тебя)

Ответить или комментировать

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