Hızlı değişken ile NSLocalizedString


86

NSLocalizedString kullanarak uygulamamı yerelleştirmeye çalışıyorum. XLIFF dosyasını içe aktardığımda, çoğu iş bir tılsım gibi çalışıyor ancak bir şey olmuyor ve bazı dizeler yerelleştirilmiyor. Sorunun içinde değişken bir şey içeren NSLocalizedString'den kaynaklandığını fark ettim:

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

veya

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

Belki de bu tür şeyler için doğru sözdizimi bu değildir. Biri bana bunu nasıl hızlı yapacağımı açıklayabilir mi? Çok teşekkür ederim.


Bu, sağlam bir mimari için
Mendy

Yanıtlar:


138

sprintfİçindeki biçim parametrelerini kullanabilirsiniz NSLocalizedString, böylece örneğiniz aşağıdaki gibi görünebilir:

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

6
Localizable.string
Van Du Tran

Obj-C ile aynı:" - %d Notifica"=" - %d Notifica";
Yeniden Tespit

3
Bir dizeyi nasıl değiştiririm? %sÇalışmayan değiştiriciyi kullanmayı denedim = \
igrek

12
@igrek %@Bir dizeyi değiştirmek için kullanın .
Yeehaw

3
Bu biçimlendirme parametreleri için referans: developer.apple.com/library/content/documentation/Cocoa/…
Shaun Dychko

96

WWDC2014 "Xcode 6 ile Yerelleştirme" Oturum # 412'de Swift'de bunun doğru yolu şudur:

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

Neden NSLocalizedString (...) kullanmanız gerekiyor? String.localizedStringWithFormat (...) uygulamasında olmuyor mu?
Yitzchak


1
Teşekkürler, sorduktan sonra zaten gördüm. Başkaları için çok yararlı olacak, bu yüzden teşekkürler
Yitzchak

25

Yerelleştirmek için birçok dizem olduğu için String'e uzantı oluşturma yaklaşımını izledim.

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

Kodda yerelleştirme için kullanmak için şunları yapın:

self.descriptionView.text = "Description".localized

Dinamik değişkenli dizeler için şunları izleyin:

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

Dize dosyalarındaki dizeleri farklı diller için bildirin (örnek: Arapça ve İngilizce)

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin

Umut yardımcı olacaktır!


2
Ama bana öyle geliyor ki, zamanı dizeye ekliyorsun. Ya yerelleştirilmiş dizeniz şöyle olsaydı The doors open at %@ o'clock. Çözümünüz yine de işe yarar mı?
Houman

Evet, String olarak arkadan zaman aldığım için mükemmel çalışıyor.
JaspreetKour

1
Referansını eklediğiniz için teşekkür ederiz Localizable.strings. Ancak @Houman'ın geçerli bir endişesi olduğunu düşünüyorum.
Matt

İnsanların neden "yorum" değerini bırakmak istediklerini bilmiyorum. Metnin açıklamasını ve amacını yerelleştirme mühendislerine verir; bunlar olmadan bu metni bir düğme üzerinde veya etiket olarak kullanma niyetini çıkaramazlar.
Satyam

8

Yukarıdaki çözümleri denedim ancak aşağıdaki kod benim için çalıştı

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

İşte String'de kullandığım bir uzantı, değişken argümanlar içeren bir localizeWithFormat işlevi ekler,

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

Kullanım:

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'in sahip olduğu aynı işlevi ve özellik adlarını kullanmamaya dikkat edin. Normalde tüm çerçeve işlevlerim için 3 harfli bir önek kullanırım.


-5

Bir yarattı extensioniçin Stringbirçok beri stringsolmak localized.

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

Örneğin:

let myValue = 10
let anotherValue = "another value"

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

6
Bu yaklaşımın en büyük dezavantajı, çevirmene gönderilecek dizeleri el ile çıkarmanız gerektiğidir Editor > Export for Localization..., çünkü onları almayacaktır.
Jason Moore

@ JasonMoore'un önerdiği göz önüne alındığında, bunun doğru yaklaşım olduğunu düşünmüyorum.
Yuchen Zhong

@JasonMoore tamamen sana katılıyorum. Bunun için bir çözüm buldunuz mu?
gasparuff

Bu çözümün neden indirildiğini bilmiyorum :(. ve hemen hemen altındaki çözümün altındaki yuva aynı, ancak yükseliyor
Amr Angry
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.