Доброго времени суток, Хаброчитатель!
Возникла у меня необходимость перевести интерфейс одной системы. Перевод для каждой формы лежит в отдельном XML-файле, а файлы группами разбросаны по папкам, что очень неудобно. Решено было создать единый словарь, чтобы в Excel’е работать с переводом всех форм. Данная задача в свою очередь разбивается на 2 подзадачи: извлечь информацию из всех XML-файлов в один CSV-файл, после перевода из CSV-файла создать XML-файлы с прежней структурой. В качестве инструментов были выбраны bash и awk. Первую подзадачу описывать смысла нет, так как она достаточно тривиальная. А вот как распарсить CSV-файл?
В Интернете можно найти множество информации на эту тему. Большинство примеров с легкостью справляются только с простыми вариантами. Но я не нашел ничего подходящего, например, для такого:
В Excel’е эти строки выглядит так:
Взяв за основу пример с OpenNET, я решил его изменить. Вот текст awk-программы:
А вот фрагмент bash-скрипта (
В итоге из таблицы
формируется файл list.template.xml с таким содержимым:
P.S.
Знаю, что можно выбрать другие инструменты, которыми можно решить задачу эффективнее. Возможно, Python. Данный пример будет полезен тем, кто по каким-либо причинам не может ими воспользоваться.
Возникла у меня необходимость перевести интерфейс одной системы. Перевод для каждой формы лежит в отдельном XML-файле, а файлы группами разбросаны по папкам, что очень неудобно. Решено было создать единый словарь, чтобы в Excel’е работать с переводом всех форм. Данная задача в свою очередь разбивается на 2 подзадачи: извлечь информацию из всех XML-файлов в один CSV-файл, после перевода из CSV-файла создать XML-файлы с прежней структурой. В качестве инструментов были выбраны bash и awk. Первую подзадачу описывать смысла нет, так как она достаточно тривиальная. А вот как распарсить CSV-файл?
В Интернете можно найти множество информации на эту тему. Большинство примеров с легкостью справляются только с простыми вариантами. Но я не нашел ничего подходящего, например, для такого:
./web/analyst/xml/list.template.xml;test;"t ""test""; est"./web/analyst/xml/list.template.xml;%1 _{factory_desc}s found. Displaying %2 through %3;Найдено объектов: %1. Отображено с %2 по %3
В Excel’е эти строки выглядит так:
| Файл | Тег | Перевод |
|---|---|---|
| ./web/analyst/xml/list.template.xml | test | t «test»; est |
| ./web/analyst/xml/list.template.xml | %1 _{factory_desc}s found. Displaying %2 through %3 | Найдено объектов: %1. Отображено с %2 по %3 |
Взяв за основу пример с OpenNET, я решил его изменить. Вот текст awk-программы:
{ $0=$0";"; while($0) { # определяем начало и конец подстроки с ячейкой, ограниченной ; или ""; match($0,/[^;"]*;|^"[^"]*(""[^"]*)*";/); # заносим ячейку в переменные F и SF SF=F=substr($0,RSTART,RLENGTH); # убираем ; и ""; gsub(/^"|";$|;$/,"",F); # меняем двойные кавычки на одниночные gsub("\"\"","\"",F); ++c; # заносим в переменную file_to путь к xml-файлу из первой ячейки в строке if (c%3==1) file_to=AWK_XML_PATH F; # записываем в xml-файл tag из второй ячейки в строке if (c%3==2) print " <ResourceString>\r\n <tag>"F"</tag>" > file_to; # записываем в xml-файл value из третьей ячейки в строке if (c%3==0) print " <value>"F"</value>\r\n </ResourceString>\r\n" > file_to; # экранируем бекслеш в переменной SF gsub(/\\/,"\\\\",SF); # экранируем спец. символы в переменной SF gsub("([][?$|^+*()])","\\\\""&",SF); # удаляем из обрабатываемой строки обработанную подстроку SF с экранированными спец. символами sub(SF,""); } }
А вот фрагмент bash-скрипта (
XML_PATH – переменная с путем, по которому располагаются папки с XML-файлами):# Конвертируем файл с переводом и убираем названия столбцов iconv -f WINDOWS-1251 -t UTF8 $1 | tr -d '\r' | sed '1d' > translation.csv # "Раскидываем" файл с переводом по xml-файлам awk -v AWK_XML_PATH="$XML_PATH" –f csv_parse.awk translation.csv
В итоге из таблицы
| Файл | Тег | Перевод |
|---|---|---|
| ./web/analyst/xml/list.template.xml | test | t «test»; est |
| ./web/analyst/xml/list.template.xml | %1 _{factory_desc}s found. Displaying %2 through %3 | Найдено объектов: %1. Отображено с %2 по %3 |
формируется файл list.template.xml с таким содержимым:
<ResourceString> <tag>test</tag> <value>t "test"; est</value> </ResourceString> <ResourceString> <tag>%1 _{factory_desc}s found. Displaying %2 through %3</tag> <value>Найдено объектов: %1. Отображено с %2 по %3</value> </ResourceString>
P.S.
Знаю, что можно выбрать другие инструменты, которыми можно решить задачу эффективнее. Возможно, Python. Данный пример будет полезен тем, кто по каким-либо причинам не может ими воспользоваться.
