迅速な変数を持つNSLocalizedString


86

NSLocalizedStringを使用してアプリをローカライズしようとしています。XLIFFファイルをインポートすると、ほとんどがチャームのように機能しますが、何かが機能せず、一部の文字列がローカライズされていません。問題は、NSLocalizedStringに次のような変数が含まれていることが原因であることに気付きました。

NSLocalizedString(" - \(count) Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare")

または

NSLocalizedString("Notifica per \(medicina!) della prescrizione \(prescription!)\nMemo: \(memoTextView.text)", comment: "Messaggio della Local Notification")

たぶん、これはこの種のものの正しい構文ではありません。誰かが私にそれを迅速に行う方法を説明できますか?どうもありがとうございました。


これは、非常に良い記事堅牢なアーキテクチャのためスウィフトでローカライズについて
メンディ

回答:


138

sprintfNSLocalizedStringでフォーマットパラメータを使用できるため、例は次のようになります。

let myString = String(format: NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)

6
Localizable.stringではどのように見えますか
Van Du Tran

Obj-Cと同じ:" - %d Notifica"=" - %d Notifica";
ReDetection 2016

3
文字列を置き換えるにはどうすればよいですか?%s動作しなかった修飾子を使用しようとしました= \
igrek 2016

12
@igrek%@文字列を置き換えるために使用します。
Yeehaw 2017

3
これらのフォーマットのパラメータの参照があるdeveloper.apple.com/library/content/documentation/Cocoa/...
ショーンDychko

96

WWDC2014「Xcode6によるローカライズ」のセッション#412で、Swiftでこれを行う適切な方法は次のとおりです。

String.localizedStringWithFormat(
    NSLocalizedString(" - %d Notifica",
    comment: "sottotitolo prescrizione per le notifiche al singolare"),
    count)

NSLocalizedString(...)を使用する必要があるのはなぜですか?String.localizedStringWithFormat(...)の実装では発生しませんか?
yitzchak 2016

2
(チェックアウトstackoverflow.com/questions/26237549/...
マーク

1
聞いてみて、もう見ました。それは他の人にとって非常に役立つでしょうので、感謝します
Yitzchak 2016

25

ローカライズする文字列がたくさんあるので、Stringの拡張機能を作成するアプローチに従いました。

extension String {
    var localized: String {
        return NSLocalizedString(self, comment:"")
    }
}

コードのローカリゼーションに使用するには、次のようにします。

self.descriptionView.text = "Description".localized

動的変数を持つ文字列の場合は、次のとおりです。

self.entryTimeLabel.text = "\("Doors-open-at".localized) \(event.eventStartTime)"

さまざまな言語の文字列ファイルで文字列を宣言します(例:アラビア語と英語)

ここに画像の説明を入力してください ここに画像の説明を入力してください

助けてくれることを願っています!


2
しかし、私にはあなたが文字列に時間を付けているだけのようです。ローカライズされた文字列がのようだった場合はどうなりますかThe doors open at %@ o'clock。あなたのソリューションはまだ機能しますか?
Houman

はい、文字列として後ろから時間を取っているので、完全に機能しています。
JaspreetKour

1
への参照を含めていただきありがとうございLocalizable.stringsます。ただし、@ Houmanには正当な懸念があると思います。
マット

なぜ人々が「コメント」の価値を中退したいのか分かりません。それは彼らが、ボタンやラベルなどとしてそのテキストを使用する意図を作ることができないことなく、ローカリゼーションエンジニアにテキストとその目的の説明を与える
サティヤム

8

私は上記の解決策を試しましたが、以下のコードは私のために働きました

SWIFT 4

extension String {

    /// Fetches a localized String
    ///
    /// - Returns: return value(String) for key
    public func localized() -> String {
        let path = Bundle.main.path(forResource: "en", ofType: "lproj")
        let bundle = Bundle(path: path!)
        return (bundle?.localizedString(forKey: self, value: nil, table: nil))!
    }


    /// Fetches a localised String Arguments
    ///
    /// - Parameter arguments: parameters to be added in a string
    /// - Returns: localized string
    public func localized(with arguments: [CVarArg]) -> String {
        return String(format: self.localized(), locale: nil, arguments: arguments)
    }

}

// variable in a class
 let tcAndPPMessage = "By_signing_up_or_logging_in,_you_agree_to_our"
                                     .localized(with: [tAndc, pp, signin])

// Localization File String
"By_signing_up_or_logging_in,_you_agree_to_our" = "By signing up or logging in, you agree to our \"%@\" and \"%@\" \nAlready have an Account? \"%@\"";

7

これは私がStringで使用する拡張機能であり、可変引数を持つlocalizeWithFormat関数を追加します。

extension String:{

     func localizeWithFormat(arguments: CVarArg...) -> String{
        return String(format: self.localized, arguments: arguments)        
     }

     var localized: String{
         return Bundle.main.localizedString(forKey: self, value: nil, table: "StandardLocalizations")
     }
}

使用法:

let siriCalendarText = "AnyCalendar"
let localizedText = "LTo use Siri with my app, please set %@ as the default list on your device reminders settings".localizeWithFormat(arguments: siriCalendarTitle)

Stringと同じ関数名とプロパティ名を使用しないように注意してください。私は通常、すべてのフレームワーク機能に3文字のプレフィックスを使用します。


-5

することがたくさんあっextensionStringので、toを作成しました。stringslocalized

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}

例えば:

let myValue = 10
let anotherValue = "another value"

let localizedStr = "This string is localized: \(myValue) \(anotherValue)".localized
print(localizedStr)

6
このアプローチの大きな欠点は、文字列を取得しEditor > Export for Localization...ないため、翻訳者に送信する文字列を手動で抽出する必要があることです。
ジェイソンムーア

@JasonMooreが提案したことを考えると、これは正しいアプローチではないと思います。
Yuchen Zhong 2017

@JasonMooreはあなたに完全に同意します。誰かがこれに対する解決策を見つけましたか?
gasparuff 2017

このソリューションがダウンレートされている理由がわかりません:(。そして、ソリューションの下のネストの下のほとんどは同じですが、レートが高くなっています
Amr Angry
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.