13

を含む基本的なSwiftファイルTest.swiftがあります

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")
    }
}

このファイルで実行するgenstringsと、予期しない警告が表示されます

$ genstrings -u Test.swift
Bad entry in file Test.swift (line = 9): Argument is not a literal string.

生成されたLocalizable.stringsファイルにエントリがありません"key 1"

$ cat Localizable.strings 
??/* comment 2 */
"key 2" = "key 2";

ただし、ファイルで以下のコードを使用してObjective-Cで同等のことを行うと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

コマンドはgenstrings期待どおりに機能し、のエントリを取得し"key 1"ます。

$ genstrings -u Test.m 
$ cat Localizable.strings 
??/* comment 1 */
"key 1" = "value 1";

/* comment 2 */
"key 2" = "key 2";

私は何を間違っていますか?

4

2 に答える 2

29

どうやら Apple は genstring のサポートから離れたようです。代わりに次を使用します。

xcrun extractLocStrings

あなたの命令として。たとえば、プロジェクトの Localizable.strings を作成するには:

find ./ -name "*.m" -print0 | xargs -0 xcrun extractLocStrings -o en.lproj

スウィフトの場合:

find ./ -name "*.swift" -print0 | xargs -0 xcrun extractLocStrings -o en.lproj

.xliff ファイルにエクスポートする場合は、xCode として genstring を実行する必要がまったくないことに注意してください。

エディタ > ローカリゼーション用にエクスポート

コマンドは、文字列を「舞台裏で」処理します。

更新: 私は xCode 7.3.1 を使用しており、私のシステムでは xtractLocStrings はバイナリです。

$ file /Applications/Xcode.app//Contents/Developer/usr/bin/extractLocStrings
    /Applications/Xcode.app//Contents/Developer/usr/bin/extractLocStrings: Mach-O 64-bit executable x86_64

これが私のテストです:

let _ = NSLocalizedString("1st", comment: "1st string")
let _ = NSLocalizedString("Second", tableName: "Localized", bundle: NSBundle.mainBundle(), value: "2nd", comment: "2nd string”)

結果は次のとおりです。

Localizable.strings:
/* 1st string */
"1st" = "1st”;

Localized.strings:
/* 2nd string */
"Second" = "2nd”;
于 2016-07-01T11:06:52.663 に答える