Извлечение строк локализации из списков Settings.bundle - PullRequest
3 голосов
/ 17 июня 2009

Если вы создаете дочерние панели в файле Settings.bundle, вы получите несколько файлов .plist. Когда приходит время локализовать ваш проект, вы находите создание соответствующего файла .strings немного утомительным (я знаю, что знаю).

Вот удобный скрипт списка bash, который (i) найдет теги, (ii) извлечет содержимое следующего тега, а затем (iii) выведет это значение в текстовый файл в формате «string» = «string» нужен для ibtool.

Вы передаете имена входных и выходных файлов в качестве параметров.

#!/bin/sh
echo "// Generated by plist2strings. Manual edits will be overwritten the next time this script runs.\n/* A single strings file, whose title is specified in your preferences schema. The strings files provide the localized content to display to the user for each of your preferences. */\n" > plist2stringstmp
sed -n '
# look for a "#" at the end of the line
/<key>Title<\/key>$/ {
# Found one - now read in the next line
 N
# delete the "#" and the new line character, 
 s/.*<\(string\)>\(.*\)<\/\1>/"\2" = "\2"/gp
}' $1 > plist2stringstmp2
cat plist2stringstmp plist2stringstmp2 > $2
rm plist2stringstmp plist2stringstmp2

Copy-N-Paste в текстовый файл. Я сохранил мой как plist2strings. Обязательно предоставьте ему права на выполнение. Например, в Терминале выполните:

macbook:~ foo$ chmod 755 plist2strings

Чтобы выполнить скрипт (если он был сохранен в вашей папке пользователя) из корня каталога Settings.bundle, просто используйте синтаксис:

macbook:~ foo$ ~/plist2strings mysettings.plist en.lprog/mysettings.strings

Если mysettings.strings еще нет в этой папке, он создаст его. Если он уже , он автоматически перезапишет его без предупреждения.

Надеюсь, кто-нибудь найдет это полезным. И не стесняйтесь использовать (и злоупотреблять) по своему усмотрению (будьте осторожны ;-). Если вы вносите какие-либо полезные изменения, рассмотрите возможность размещения их здесь, чтобы другие пользователи тоже могли ими насладиться.

Счастливая локализация!

~ Зак

Ответы [ 3 ]

3 голосов
/ 07 июня 2011

Я использую эту лучшую версию с быстрым исправлением (она просто удаляет дубликаты).

#!/bin/sh
echo "// Generated by plist2strings. Manual edits will be overwritten the next time this script runs.\n/* A single strings file, whose title is specified in your preferences schema. The strings files provide the localized content to display to the user for each of your preferences. */\n" > plist2stringstmp
sed -n '
# look for a "#" at the end of the line
/<key>Title<\/key>$/ {
# Found one - now read in the next line
 N
# delete the "#" and the new line character, 
 s/.*<\(string\)>\(.*\)<\/\1>/"\2" = "\2"/gp
}' $1 > plist2stringstmp2
cat plist2stringstmp2 | sort | uniq > tmp
cat plist2stringstmp2 >> plist2stringstmp 
mv plist2stringstmp $2
rm plist2stringstmp2

TODO: извлечь строки из массива заголовков следующим образом:

<key>Titles</key>
            <array>
                <string>STH</string>
                <string>STH2</string>
                <string>STH3</string>
            </array>
1 голос
/ 24 декабря 2016

Это старая ветка. Тем не менее, я использовал оригинальный сценарий в течение некоторого времени, благодаря OP Zack.

Я решил отредактировать скрипт, чтобы также извлекать строки из массивов заголовков, как предложено descent89.

Кроме того, благодаря использованию синтаксиса 2addr sed он стал более читабельным. Моя версия не сортирует и не удаляет дубликаты, потому что с заголовками массивов полезно сохранять порядок строк.

Вот оно:

#!/bin/sh
echo "// Generated by plist2strings. Manual edits will be overwritten the next time this script runs.\n/* A single strings file, whose title is specified in your preferences schema. The strings files provide the localized content to display to the user for each of your preferences. */\n\n/* String for Title elements */" > $2

sed -n '/<key>Title<\/key>$/,/<\/string>$/ s/.*<\(string\)>\(.*\)<\/\1>/"\2" = "\2";/gp' $1 >> $2

echo "\n/* String for Titles arrays elements */" >> $2

sed -n '/<key>Titles<\/key>$/,/<\/array>$/ s/.*<\(string\)>\(.*\)<\/\1>/"\2" = "\2";/gp' $1 >> $2
0 голосов
/ 17 июня 2009

К вашему сведению, вы можете получить несколько дублирующих строк здесь или там. Если кто-то чувствует себя мотивированным, было бы неплохо увидеть (а) повторную проверку и / или (б) объединение результатов из существующего файла.

...