I have a basic Swift file Test.swift
which contains
import Foundation
import UIKit
class Test: NSObject {
let a: String
let b: String
override init() {
a = NSLocalizedString("key 1", tableName: nil,
bundle: NSBundle.mainBundle(), value: "value 1", comment: "comment 1")
b = NSLocalizedString("key 2", comment: "comment 2")
}
}
When I run genstrings
on this file I receive an unexpected warning
$ genstrings -u Test.swift
Bad entry in file Test.swift (line = 9): Argument is not a literal string.
and the generated Localizable.strings
file is missing the entry for "key 1"
$ cat Localizable.strings
??/* comment 2 */
"key 2" = "key 2";
However, when I do the equivalent in Objective-C using the below code in a file Test.m
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface Test: NSObject
@property (nonatomic, strong) NSString *a;
@property (nonatomic, strong) NSString *b;
@end
@implementation Test
- (id)init {
self = [super init];
if (self) {
self.a = NSLocalizedStringWithDefaultValue(@"key 1", nil, [NSBundle mainBundle], @"value 1", @"comment 1");
self.b = NSLocalizedString(@"key 2", @"comment 2");
}
return self;
}
@end
the genstrings
command works as expected and I get the entry for "key 1"
.
$ genstrings -u Test.m
$ cat Localizable.strings
??/* comment 1 */
"key 1" = "value 1";
/* comment 2 */
"key 2" = "key 2";
What am I doing wrong?
Apparently Apple has stepped away from supporting genstrings. Instead use:
xcrun extractLocStrings
as your command. For example, to create Localizable.strings for your project:
find ./ -name "*.m" -print0 | xargs -0 xcrun extractLocStrings -o en.lproj
and for Swift:
find ./ -name "*.swift" -print0 | xargs -0 xcrun extractLocStrings -o en.lproj
Note that if you are going to export to a .xliff file there is no longer any need to run genstrings at all as the xCode
Editor > Export for localization
command will process your strings 'behind the scenes'.
Update: I’m on xCode 7.3.1 and on my system xtractLocStrings is a binary.
$ file /Applications/Xcode.app//Contents/Developer/usr/bin/extractLocStrings
/Applications/Xcode.app//Contents/Developer/usr/bin/extractLocStrings: Mach-O 64-bit executable x86_64
Here is my test:
let _ = NSLocalizedString("1st", comment: "1st string")
let _ = NSLocalizedString("Second", tableName: "Localized", bundle: NSBundle.mainBundle(), value: "2nd", comment: "2nd string”)
and here are the results:
Localizable.strings:
/* 1st string */
"1st" = "1st”;
Localized.strings:
/* 2nd string */
"Second" = "2nd”;
This is a bug of genstrings in both Xcode 6.4 and Xcode 7 beta, as reported in https://openradar.appspot.com/22133811:
In Swift files, genstrings Chokes On NSLocalizedString calls with more than two parameters
Summary: When running genstrings against a Swift file, if there are any NSLocalizedString calls that use more than the trivial case of "value" and "comment" parameters, genstrings errors out. ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With