2013-10-25 2 views
0

Извините, что вам нужно еще потрудиться. Я реализую приложение с локализацией английского и японского языков в xcode 5, используя файл сценария, созданный Андре Пинто, на основе SIngle Storyboard for multiple languages. Ну, до обновления до xcode 5 (xcode 4.6, я имею в виду), все работает правильно. Но так как Xcode 5, эта ошибка возникает при запуске файла сценария:xcode 5 локализовать раскадровку со сценарием delete * .strings file?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
    <key>com.apple.ibtool.errors</key> 
    <array> 
     <dict> 
      <key>description</key> 
      <string>Interface Builder could not open the document "xx.storyboard" because it does not exist.</string> 
     </dict> 
    </array> 
    </dict> 
</plist> 

Iconv: ./xx/Base.lproj/xx.strings.new: No such file or directory 
Rm: ./xx/Base.lproj/xx.strings.new: No such file or directory 
Merging xx.strings changes for en.lproj... 
Merging xx.strings changes for ja.lproj... 
Command /bin/sh emitted errors but did not return a nonzero exit code to indicate failure 

В раскадровке, есть 2 суб-файлы: xx.storyboard (Base) и xx.storyboard (японский)

В первая сборка, ошибки не возникает. Все прошло хорошо. Приложение локализуется так хорошо.

Во второй сборке я сделал несколько изменений в раскадровке (добавьте новую функцию), затем произойдет ошибка. Кроме того, xx.storyboard (японский) становится пустым, и это странно. Я положил много усилий перевести эти вещи, и теперь я должен сделать это снова ...

Я думаю, что есть какая-то проблема со сценарием, в strings.new и strings.old ...

Вот сценарий:

#!/bin/sh 
# Update storyboard string files 
# 
# by 2013 André Pinto [email protected] 
# based on http://forums.macrumors.com/showthread.php?t=1467446 

storyboardExt=".storyboard" 
stringsExt=".strings" 
newStringsExt=".strings.new" 
oldStringsExt=".strings.old" 
localeDirExt=".lproj" 
baselprojName="Base.lproj" 

# Find Base internationalization folders 
find . -name "$baselprojName" | while read baselprojPath 
do 
    # Get Base project dir 
    baselprojDir=$(dirname "$baselprojPath") 

    # Find storyboard file full path inside base project folder 
    find "$baselprojPath" -name "*$storyboardExt" | while read storyboardPath 
    do 
     # Get Base strings file full path 
     baseStringsPath=$(echo "$storyboardPath" | sed "s/$storyboardExt/$stringsExt/") 

     # Get storyboard file name and folder 
     storyboardFile=$(basename "$storyboardPath") 
     storyboardDir=$(dirname "$storyboardPath") 

     # Create strings file only when storyboard file newer 
     newer=$(find "$storyboardPath" -prune -newer "$baseStringsPath") 
     [ -f "$baseStringsPath" -a -z "$newer" ] && { 
      echo "$storyboardFile file not modified." 
      continue 
     } 

     # Get New Base strings file full path and strings file name 
     newBaseStringsPath=$(echo "$storyboardPath" | sed "s/$storyboardExt/$newStringsExt/") 
     stringsFile=$(basename "$baseStringsPath") 

     echo "Creating default $stringsFile for $storyboardFile..." 
     ibtool --export-strings-file "$newBaseStringsPath" "$storyboardPath" 
     iconv -f UTF-16 -t UTF-8 "$newBaseStringsPath" > "$baseStringsPath" 
     rm "$newBaseStringsPath" 

     # Get all locale strings folder with same parent as Base 
     ls -d "$baselprojDir/"*"$localeDirExt" | while read localeStringsDir 
     do 
      # Skip Base strings folder 
      [ "$localeStringsDir" = "$storyboardDir" ] && continue 

      localeDir=$(basename "$localeStringsDir") 
      localeStringsPath="$localeStringsDir/$stringsFile" 

      # Just copy base strings file on first time 
      if [ ! -e "$localeStringsPath" ]; then 
       echo "Copying default $stringsFile for $localeDir..." 
       cp "$baseStringsPath" "$localeStringsPath" 
      else 
       echo "Merging $stringsFile changes for $localeDir..." 
       oldLocaleStringsPath=$(echo "$localeStringsPath" | sed "s/$stringsExt/$oldStringsExt/") 
       cp "$localeStringsPath" "$oldLocaleStringsPath" 

       # Merge baseStringsPath to localeStringsPath 
       awk ' 
NR == FNR && /^\/\*/ { 
    x=$0 
    getline 
    a[x]=$0 
    next 
} 
/^\/\*/ { 
    x=$0 
    print 
    getline 
    $0=a[x]?a[x]:$0 
    printf $0"\n\n" 
}' "$oldLocaleStringsPath" "$baseStringsPath" > "$localeStringsPath" 

       rm "$oldLocaleStringsPath" 
      fi 
     done 
    done 
done 

Localizable.strings и InfoPlist.strings по-прежнему хороши.

У кого-нибудь есть опыт работы с подобными вещами, помогите мне ... Это что-то с xcode или файлом скрипта или файлом xx.strings? Я не понимаю ...

Я могу спросить его непосредственно создателя сценария, но я думаю, что вопрос здесь будет лучше. Я ТАК любитель :)

ответ

1

Я использовал тот же скрипт, что и вы, и имел те же проблемы, что и вы. Затем I foundthesearticles от AppliedIS, подробно описывающий их процесс I18n и L10n. Они использовали обновленную версию этого скрипта, которая кажется немного более надежной.

У них также есть скрипт для извлечения ключей из операторов NSLocalizedString и генерации Localizable.strings для каждого языкового стандарта. Этот скрипт использует комментарий как значение при создании новых записей, что довольно умно.

Теперь я переключился на них, и это кажется более быстрым (это может быть только я, ooh, new == faster), имеет больше выходных данных (отлично подходит для отладки), а также работает без Run script only when installing.

Проверьте это! (Я ни с кем не связан с ними, просто счастливый пользователь)

+0

Спасибо, это отличный сценарий! – Eddie

1

Я думаю, что это решение:

перейти к xx.xcodeproj-> мишенями> Build phases-> Run Script-> Tick на "Выполнить скрипт только при установке"

Я не знаю, как, почему, но это, похоже, решает проблему ... Я думаю, потому что скрипт запускается при установке на симулятор ios, поэтому, когда я строю, он не может найти xx.storyboard .. .

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

1

Я считаю, что локализация возникает только при установке приложения. Поэтому у вашего обходного пути есть все основания для работы, поскольку сценарий имеет дело с локализацией ресурсов. Обратите внимание, что многие вещи в локализации изменились, и было бы полезно просмотреть связанный internationalization guide, расположенный на веб-сайте разработчика Apple. Ссылка содержит конкретные видеоролики и темы программирования, которые предоставляют дальнейшие объяснения провайдерам. Некоторые вещи стоит рассмотреть, так это то, что вы должны использовать Autolayout, если вы планируете использовать только один контроллер просмотра. Это обеспечит правильность вашего перевода на каждом языке.

+0

Спасибо. Я передумаю это позже. Извините, я в настоящее время занят этим проектом iOS, не так много времени на SO ... – Eddie

Смежные вопросы