xcode 5本地化故事板与脚本删除* .strings文件?

时间:2013-10-25 02:31:49

标签: bash localization ios7 storyboard xcode5

抱歉再打扰一下。 我使用AndréPinto创建的基于SIngle Storyboard for multiple languages的脚本文件实现了一个应用程序,在xcode 5中使用英语和日语进行本地化。好吧,在升级到xcode 5之前(我的意思是xcode 4.6),一切正常。但是从xcode 5开始,运行脚本文件时会出现此错误:

<?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(Japanese)

在第一次构建中,不会发生错误。一切都很顺利。应用本地化非常好。

在第二个版本中,我在故事板中进行了一些更改(添加了一些新功能),然后发生错误。此外,xx.storyboard(日语)变为空白,这很奇怪。我花了很多精力翻译这些东西,现在我必须再做一次......

我认为脚本存在一些问题,即strings.new和strings.old ......

这是脚本:

#!/bin/sh
# Update storyboard string files
#
# by 2013 André Pinto andredsp@gmail.com
# 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文件的东西?我不明白......

我可以直接问脚本的创建者,但我认为在这里发布问题会更好。我是一个如此情人:)

3 个答案:

答案 0 :(得分:1)

我认为这是解决方案:

转到xx.xcodeproj-&gt;靶&GT;构建阶段 - &gt;运行脚本 - &gt;勾选“仅在安装时运行脚本”

我不知道如何,为什么但这似乎解决了这个问题...我认为因为脚本运行时安装在ios模拟器上,所以当我构建时,它找不到xx.storyboard ...

仍欢迎任何其他答案。我仍然不能满足于这个,因为这个解决方案无法保证。

答案 1 :(得分:1)

我认为本地化只发生在安装应用程序期间。因此,由于脚本处理本地化资源,因此您的解决方法完全有理由继续工作。请注意,本地化中的许多内容都已更改,因此有必要查看位于Apple开发人员网站上的链接internationalization guide。该链接包含提供进一步说明的特定视频和编程主题。值得考虑的一些事情是,如果您只打算使用单个视图控制器,则应使用Autolayout。这将确保您使用每种语言正确翻译大小。

答案 2 :(得分:1)

我使用的是与您相同的脚本,并且遇到了与您相同的问题。然后我来自AppliedIS的found these articles,详细介绍了他们对I18n和L10n的处理过程。他们使用了这个脚本的更新版本,似乎更加强大。

它们还有一个脚本,用于从NSLocalizedString语句中提取键,并为每个语言环境生成Localizable.strings。该脚本在生成新条目时使用注释作为值,这非常聪明。

我现在已切换到这些,看起来更快(可能只是我; ooh, new == faster),有更多输出(很适合调试),它也可以在没有Run script only when installing的情况下工作。

看看吧! (我不会以任何方式与他们联系,只是一个快乐的用户)