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

2019-10-18 20:14发布

遗憾再拍打扰。 我实现一个应用程序,与在Xcode 5英语和日语的本地化,使用基于由安德烈·平托创建的脚本文件, 支持多国语言单一故事板 。 那么,升级到5的xcode(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(碱)和xx.storyboard(日语)

在第一次构建,不会发生错误。 一切都很好。 应用本地化那么好。

在第二内建,我做在故事板somechange(增加一些新的功能),然后错误发生。 此外,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? 我不明白这一点...

我会直接问其剧本的创作者,但我想在这里发表的问题会更好。 我是一个SO情人:)

Answer 1:

我用的是同一个脚本,你,和有同样的问题你。 后来我发现 这些 文章从AppliedIS,详细说明其国际化和本地化的过程。 他们使用这个脚本,这似乎是稍微更稳健的更新版本。

他们也有从提取按键脚本NSLocalizedString报表和产生Localizable.strings对各个地区也是如此。 此脚本使用作为产生新的项目时的价值,这是相当聪明的评论。

我已经切换到这些,现在,它似乎更快(这可能只是我, ooh, new == faster ),有更多的输出(漂亮调试),也作品,未经Run script only when installing

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



Answer 2:

我认为这是解决方案:

去xx.xcodeproj->靶>构建phases->运行脚本 - >“只有在安装运行脚本”勾选上

我不知道怎么了,为什么但这似乎解决这个问题......我想,因为当运行该脚本安装在iOS模拟器,所以当我打造,它无法找到xx.storyboard ...

任何其他的答案仍然是值得欢迎的。 我仍然无法与这一个满足,因为有这种方案不能保证。



Answer 3:

我相信本地化仅在安装应用程序的出现。 因此,你的解决方法有充分的理由,因为与本地化资源脚本交易工作。 请注意,在本地化许多事情发生了变化,这将是值得检讨联国际指南位于苹果开发者网站上。 该链接包含特定的影片和节目的主题,提供进一步的解释。 一些值得考虑的事情之一是,你应该使用自动布局,如果你只使用一个单一的视图控制器的计划。 这将确保您的翻译在每种语言正确尺寸。



文章来源: xcode 5 localize storyboard with script delete *.strings file?