Xcode 6.3.2或6.4beta本地化无法读取string文件

是的,我知道有很多关于这个失败的讨论。 但是经过检查后,我觉得我现在所拥有的是不同的。

在这里错误,而“导出本地化..”Xcode 6.3 ,它说单引号(')应被replace为(\)在string文件。

在这里Xcode 6本地化无法读取一个string文件 ,它说NSLocalizedString应该被注释掉(如果我理解的话)。

为了testing这个问题,我创build了一个6.3.2和6.4的新项目(6E23)。 我可以在string文件中有单引号,但只要有NSLocalizedString(例如var str = NSLocalizedString("Hi", tableName: nil, bundle: NSBundle.mainBundle(), value: "Hi", comment: "Hi") )在视图控制器文件中,Xcode总是popup 在这里输入图像说明

然后我做了

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

我得到了

在文件ViewController.swift(行= 26)中的错误条目:参数不是一个文字string。

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

[MT] DVTAssertions:Warning in /SourceCache/IDEFrameworks/IDEFrameworks-7718/IDEFoundation/Localization/IDELocalizationWork.m:434

详细信息:无法读取string文件“/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:错误:本地化无法读取string文件

即使我注释掉第26行,这个错误依然存在

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

但是如果我删除第26行,错误消失了。

所以,我guese,XLIFF发生器不知何故不允许“NSLocalizedString”出现任何?

你有没有find像我这样的?

有几个问题,导致这个错误:

1.清空Localizable.strings文件。

解决scheme:只需添加评论

  /** no localizable strings **/ 

到这个文件,问题就没有了。

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

解决scheme:删除它,找出你的特殊字符的东西。 而且你的导出过程可能会完成而没有错误。

另外\产生另一个bug:

刺出口:

 "ACCOUNT" = "Foo\\\'Bar\'bazz\""; 

导入刚刚导出的文件后的string:

 "ACCOUNT" = "\\''"; 

奖金:

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

欢迎来到苹果公司本地化!


PS

  • 至less对于Version 6.4 (6E35b)
  • 相关的openradar bug报告

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

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

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

我在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的string本地化扫描器的一种错误(我认为这是一个天真的方法,他们期望人们只使用NSLocalizedString(key, comment: comment) ,因此只期望string作为参数的方法)。

你得到相同的行为,不pipe行被注释掉的原因是本地化的string检测不排除注释,所以你的NSLocaluzedString调用被发现,因此你的.strings文件被处理,等等。

我已经通过重新定义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) } 

replaceyourBundleHere NSBundle.mainBundle()或你想要什么。

我有同样的问题,这是因为我使用unicode格式这样的\ u0027 \当我使用一个apostroph charachter',当我把u字符replace成小\错误信息去了。

另外,你不能评论NSLocalizedString,因为它挂断parsing器,你必须从代码中删除它。