2 March 2015

Локализация Android приложения средствами Google Sheets

Development for AndroidGoogle API
Sandbox
Добрый день!

В данной статье хотелось бы поделиться своим небольшим опытом использования Google Таблиц при локализации Android приложения. Изначально требовалось перевести разрабатываемое приложение только на язык заказчика, т.е. норвежский. В это время в IntelliJ Idea не существовало Translations Editor'a, а Android Studio готовилось к выходу из беты.

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

TL;DR готовый документ. Чтобы получить файлы strings.xml, жмем Export Files -> Export sheets to strings.xml. Приложение Google Drive, которое должно быть установлено на вашей машине, скачает результат.

В самом начале мы использовали простой Excel документ для перевода и email пинг понг с переводчиком для общения с ним. После ручного переноса ~100 строк из strings.xml в таблицу желание продолжать это постыдное занятие отпало. Был реализован импорт из xml в таблицу средствами Excel. В дальнейшем данный документ обрастал логикой: разного рода условное форматирование для визуализации вновь добавленных строк, поддержка ситуации, когда ключ от строки был переименован.

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

В итоге был получен втык от заказчика, а также новое требование: никакой сложной логики в таблице, только 4 колонки — ключ, английский исходник, норвежский, шведский и датский переводы. Чтобы избежать проблем со множеством копий документа от каждого из переводчиков, я уговорил заказчика использовать Google Sheets. Я уже не собирался экспортировать переводы в strings.xml каким-либо ручным способом — с лихвой наелся высматриванием несовпадений в строках после того злополучного слияния разных копий перевода, когда от таращения в монитор выступал пот на лбу. Затем оказалось, что для Google сервисов можно очень просто писать расширения на JS подобном языке — Google Script.

Естественно, я искал готовые сервисы, решающие данную проблему. Первые 3 ссылки в гугле и ответ на SO не дали удовлетворительных результатов. Кстати, к моменту перезда на Google Sheets вышла новая версия Idea, где появился Translations Editor, это немного упростило жизнь.

Итак, была создана таблица в документах гугла c 5 колонками — ключ, английский, норвежский, шведский, датский и комментарии, а также розданы права доступа. Чтобы поместить данные в таблицу из проекта, нужно выделить все в Translation Editor'e и вставить в любой редактор таблиц, удалить лишние столбцы (Untranslatable — мы не используем его) и вставить результат в гугловский документ. Необходимо также упомянуть, что наш проект состоит из нескольких модулей со своими переводами, поэтому в документе имеется 2 вкладки, а описанные операции надо выполнить по разу для каждого проекта.

В итоге получается таблица со строками для перевода, которую переводчики без труда могут вместе редактировать. Когда перевод закончен, необходимо перенести результат назад к себе в проект. Я начал думать, как бы мне получить все и сразу. Максимальные усилия, на которые я готов был пойти, — это 1 копирование. Единственное решение, которое мне пришло на ум — это экспортировать результаты в Google Drive, откуда десктопным приложением они подтянутся мне на ПК. Если предварительно была создана правильная иерархия папок, то я смогу скопировать и перезаписать файлы strings.xml в 1 действие. Тут без написания небольшого скрипта не обойтись.

Нажимаем Инструменты->Редактор Скриптов и попадаем в почти полноценную IDE с автодополнением и дебагом прямо в браузере! Также создался небольшой кусочек кода, который создает дополнительное меню вы UI таблиц гугла. Нажатие на этот элемент и будет входной точкой.

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Export Sheets To strings.xml",
    functionName : "readAndExport"
  }];
  spreadsheet.addMenu("Export Files", entries);
};


Далее нехитрый код проходит по листам(вкладкам), считывает заголовки столбцов, составляет xml строку из значений в ячейках и пишет ее в файл strings.xml на вашем гугл диске в директорию trunk/[sheet_name]/res/values-[column_name]/strings.xml. Сам исходник можно посмотреть непосредственно в представленном файле. Из необычного можно упомянуть, что в гугл драйве имя директории или файла не является уникальным, т.е. можно создать 2 файла или директории с одинаковым именем. Чтобы все правильно работало, нужно использовать примерно такой код:
function getOrCreate(root, name) {
  var iterator = root.getFoldersByName(name);
  if(iterator.hasNext()) {
    return iterator.next();
  } else {
    return root.createFolder(name);
  }
}


Вывод


Google Apps обладают поистине простым и в то же время мощным API. Еще одним достоинством является тот факт, что сразу из коробки имеется доступ к API любого приложения Google: календарь, диск, почта и т.д. Мне в кратчайшие сроки удалось создать простой и удобный инструмент для локализации нашего приложения. Конечно, в нем еще есть места, которые хотелось бы улучшить, однако, я избавился от самой главной проблемы: копирования и редактирования множества файлов с одинаковой структурой и именами. Это неизбежно вело к ошибкам, вызванных невнимательностью.
Tags:разработка под androidgoogle drivegoogle sheetsgoogle api
Hubs: Development for Android Google API
+7
8k 73
Comments 10
Top of the last 24 hours