Пусть ваша IDE сделает всю тяжелую работу

Отказ от ответственности. Цель этой статьи не в том, чтобы дать исчерпывающий набор правил автоматического преобразования таких файлов, а в том, чтобы проиллюстрировать, как выиграть время с помощью нескольких приемов поиска и замены.

Сегодняшний день начался с простой, но утомительной задачи: мне нужно было повторно использовать набор переведенного текстового контента. Из аналогичного проекта iOS я хотел перейти на Android.

Несмотря на то, что такие инструменты, как Phrase, позаботятся об этом за вас, вы можете не захотеть платить за такие SaaS. Кроме того, если вы заранее не выбрали один из них, вы все равно потратите ужасное количество времени на импорт своего контента — хотя, похоже, существует какой-то инструмент для загрузки.

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

Как разработчик, вы должны знать, что управление ими различается в зависимости от iOS:

Localizable.strings
//Comment
“key_1” = “What a %@ task, don't you think?”;

и Андроид:

strings.xml
<!-- Comment -->
<string name="key_1">What a %s task, don\'t you think?</string>

Если мы упустим из виду тип файла (строки для iOS, XML для Android), мы легко заметим некоторые различия. Я специально использовал динамический строковый параметр — его можно заменить на утомительный или захватывающий, скажите вы мне!

Давайте посмотрим, что нам нужно изменить и как действовать дальше.

Обеспечение совместимости вашего локализованного файла с Android

Перевод этого файла iOS в ваш проект Android приводит к следующему результату:

  • Изменение ключа и синтаксиса связанного с ним значения
  • Адаптация динамического параметра
  • Экранирование некоторых специальных символов (например, )
  • Делаем комментарии XML читабельными

Опять же, это пример того, что вам нужно будет адаптировать.

Сначала нам нужно изменить префикс и суффикс, чтобы они содержали ключ и его значение в файле XML.

Для префикса “key_1” = “ становится <string name=”key_1">

Для суффикса ”; становится </string>

Динамический параметр изменяется с %@ на %s. Обратите внимание, что большинство других динамических типов (таких как целые и десятичные числа) используют тот же синтаксис. Кроме того, я упростил этот пример, используя только один динамический параметр. Подробнее об этом позже.

Android Studio будет жаловаться на неэкранированные символы, такие как . IDE предложит вам экранировать его с помощью обратной косой черты \ .

Наконец, если ваш файл iOS содержит комментарии, вам также необходимо преобразовать их, поскольку XML не обрабатывает их синтаксис. Итак, //Comment становится <!-- Comment -->.

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

Вы, наверное, уже знаете, что мы можем автоматизировать это с помощью скриптов. И вы были бы правы, предполагая это. Но что, если я скажу вам, что все, что вам нужно, уже упаковано в ту же IDE, которую вы используете для разработки своего приложения?

Я говорю об одной из наиболее часто используемых функций любой IDE: «Найти и заменить». Но нам нужно управлять им с помощью регулярных выражений.

Автоматизация преобразования с использованием регулярных выражений

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

Написание сценария (например, с использованием Python) было бы более эффективным. Но давайте предположим, что вы не знакомы со сценариями и довольны своей работой в среде IDE.

Некоторые операции выше не требуют использования регулярных выражений:

  • суффикс
  • специальный символ
  • синтаксис параметра

Простой поиск и замена позаботится обо всех этих случаях.

Остальное включает в себя динамический контент, который не позволяет нам просто использовать базовое действие «Найти и заменить». Нам понадобятся регулярные выражения. Вот где вы можете включить их в Android Studio:

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

Для префикса мы хотим извлечь имя ключа и повлиять на него с помощью правильного синтаксиса. Ключ обычно представляет собой одно слово, поэтому RegEx может быть таким же простым, как “(\w+)” = “ . Затем мы заменяем его ожидаемым синтаксисом <string name=”$1">, где $1 содержит соответствующий аргумент, найденный в предыдущем регулярном выражении. Android Studio подсказывает, как будет выглядеть замененный префикс

Вы можете безопасно применить это ко всем вашим вхождениям префикса.

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

Готово! Как всегда с такими преобразованиями, он не охватывает всего, и вам могут потребоваться некоторые ручные операции.

Например, если у вас есть несколько параметров с одним и тем же значением, Android нужно, чтобы вы присвоили им индекс, а iOS — нет.

Localizable.strings
“key_2” = “%@ gave %d claps for this article”;

станет:

strings.xml
<string name=“key_2”>%1$@ gave %2$d claps for this article</string>

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