Xcode 6.3.2或6.4beta本地化无法读取字符串文件

时间:2015-06-15 09:38:42

标签: ios swift localization xcode6

是的,我知道有很多关于这次失败的讨论。但在检查完之后,我认为我现在所拥有的是不同的。

在这里Error while "Export For Localization.." Xcode 6.3,它说单引号(')应该替换为字符串文件中的(\')。

在这里Xcode 6 localization failed to read a strings file,它说NSLocalizedString应该被注释掉(如果我理解的话)。

为了测试这个问题,我用6.3.2和6.4(6E23)创建了一个新项目。我可以在字符串文件中使用单引号,但只要视图控制器文件中有NSLocalizedString(例如var str = NSLocalizedString("Hi", tableName: nil, bundle: NSBundle.mainBundle(), value: "Hi", comment: "Hi")),Xcode就会弹出 enter image description here

然后我做了

xcodebuild -exportLocalizations -localizationPath ./xliff -project testtest.xcodeproj -exportLanguage en

我得到了

  

文件中的错误条目ViewController.swift(line = 26):参数不是文字字符串。

     

2015-06-15 11:08:22.177 xcodebuild [31272:1150546]

     

[MT] DVTAssertions:/SourceCache/IDEFrameworks/IDEFrameworks-7718/IDEFoundation/Localization/IDELocalizationWork.m:434中的警告

     

详细信息:无法读取字符串文件   " /var/folders/1s/_d08hx4j2gn9t6wlrc5_7gq00000gn/T/Xcode3SourceStringsAdaptor-48CAE246-EBA5-4326-B3C5-B5032A4027D8/Localizable.strings" ;,   潜在的错误:

     

无法读取数据,因为格式不正确。

     

对象:IDELocalizationWork

     

方法:+ readStringsWorkForContext:

     

主题:{number = 1,name = main}请在http://bugreport.apple.com处提交错误,并提供此警告消息以及您可以提供的任何有用信息。

     

xcodebuild:错误:本地化无法读取字符串文件

即使我注释掉第26行,

,此错误仍然存​​在
var str = NSLocalizedString("Hi", tableName: nil, bundle: NSBundle.mainBundle(), value: "Hi", comment: "Hi")

但如果删除第26行,则错误消失。

所以,我猜,XLIFF发生器不知何故不允许" NSLocalizedString"出现什么?

你有没有像我一样找到这个?

6 个答案:

答案 0 :(得分:3)

有几个问题会导致此错误:

1。空Localizable.strings个文件。

解决方案:只需添加评论

即可
    /** no localizable strings **/

到这个文件,问题就消失了。

2。转义符号中的第二个问题:\(有时)

解决方案:删除它并找出与您的特殊字符有关的内容。并且您的导出过程可能会完成而不会出错。

另外\会产生另一个错误:

Sting to export:

"ACCOUNT" = "Foo\\\'Bar\'bazz\"";
导入刚刚导出的文件后的

字符串:

"ACCOUNT" = "\\''";

加成:

如果您在导出期间尝试导入本地化Xcode将崩溃

欢迎来到Apple的本地化地狱!

P.S。

答案 1 :(得分:3)

我在Xcode 8.1上遇到了与Swift 3相同的问题,因为我有一个扩展名

func  localized() -> String {
    return NSLocalizedString(self, comment: self)
} 

我修复了它删除扩展并直接使用NSLocalizedString(“”,comment:“”)。当我尝试导出.xliff文件时,我真的不知道为什么扩展名不起作用。

答案 2 :(得分:1)

我在Xcode 6.4(6E35b)中看到过这个问题。它似乎与在方法调用中包含bundle: NSBundle.mainBundle()参数有关。

取出该参数(它有一个默认值)似乎可以解决错误。

所以改变一下:

var str = NSLocalizedString("Hi", tableName: nil, bundle: NSBundle.mainBundle(), value: "Hi", comment: "Hi")

到此:

var str = NSLocalizedString("Hi", tableName: nil, value: "Hi", comment: "Hi")

这显然是Xcode的字符串本地化扫描程序中的某种错误(我认为这是一种天真的方法,他们希望人们只使用NSLocalizedString(key, comment: comment),因此只希望字符串作为该方法的参数)。

答案 3 :(得分:0)

The reason you get the same behavior whether or not the line is commented out is that localized string detection does not exclude comments and so your NSLocaluzedString call gets discovered and therefore your .strings file is processed and so on.

答案 4 :(得分:0)

我已经通过重新定义NSLocalizedString函数来解决这个问题:

public func NSLocalizedString(key: String, tableName: String? = nil, bundle: NSBundle = NSBundle.mainBundle(), value: String = "", comment: String) -> String
{
    return yourBundleHere.localizedStringForKey(key, value: value, table: tableName)
}

yourBundleHere替换为NSBundle.mainBundle()或您想要的任何内容。

答案 5 :(得分:0)

我有同样的问题,这是因为我使用了像这个\ U0027这样的unicode格式的'apostroph charachter',当我将u char替换为小\ u0027错误信息消失了。

另外,你不能评论NSLocalizedString,因为它会挂起解析器,你必须从代码中删除它。