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

บางทีนี่อาจไม่ใช่ไวยากรณ์ที่ถูกต้องสำหรับสิ่งของประเภทนี้ บางคนสามารถอธิบายวิธีการทำอย่างรวดเร็ว? ขอบคุณมาก.


นี่เป็นบทความที่ดีมากเกี่ยวกับการแปลภาษาใน Swift เพื่อสถาปัตยกรรมที่แข็งแกร่ง
Mendy

คำตอบ:


138

คุณสามารถใช้sprintfพารามิเตอร์รูปแบบภายในNSLocalizedStringตัวอย่างของคุณจึงมีลักษณะดังนี้:

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

3
ฉันจะแทนที่สตริงได้อย่างไร ฉันพยายามใช้%sตัวปรับแต่งซึ่งใช้ไม่ได้ = \
igrek

12
@igrek ใช้%@แทนสตริง
Yeehaw

3
ข้อมูลอ้างอิงสำหรับพารามิเตอร์การจัดรูปแบบเหล่านี้คือdeveloper.apple.com/library/content/documentation/Cocoa/…
Shaun Dychko

96

ในเซสชัน # 412 ของ WWDC2014 "Localizing with Xcode 6" วิธีที่เหมาะสมใน Swift มีดังต่อไปนี้:

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

ทำไมคุณต้องใช้ NSLocalizedString (... ) มันไม่เกิดขึ้นในการใช้งาน String.localizedStringWithFormat (... )?
Yitzchak


1
ขอบคุณที่ฉันเห็นมันแล้วหลังจากที่ฉันถาม จะเป็นประโยชน์มากสำหรับคนอื่น ๆ ขอบคุณ
Yitzchak

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

ประกาศสตริงในไฟล์ String สำหรับภาษาต่างๆ (เช่นอาหรับและอังกฤษ)

ใส่คำอธิบายภาพที่นี่ ใส่คำอธิบายภาพที่นี่

หวังว่าจะช่วยได้!


2
แต่สำหรับฉันดูเหมือนว่าคุณกำลังผูกเวลาไว้กับสตริง The doors open at %@ o'clockเกิดอะไรขึ้นถ้าสตริงที่มีการแปลของคุณเป็นเหมือน โซลูชันของคุณจะยังคงใช้งานได้หรือไม่?
Houman

ใช่มันทำงานได้อย่างสมบูรณ์เมื่อฉันได้รับเวลาเป็น String จากด้านหลัง
JaspreetKour

1
Localizable.stringsขอบคุณสำหรับการรวมทั้งการอ้างอิงถึง อย่างไรก็ตามฉันคิดว่า @Houman มีข้อกังวลที่ถูกต้อง
Matt

ฉันไม่รู้ว่าทำไมผู้คนถึงต้องการยกเลิกค่า "ความคิดเห็น" ให้คำอธิบายของข้อความและวัตถุประสงค์แก่วิศวกรโลคัลไลเซชันโดยที่พวกเขาไม่สามารถระบุเจตนาที่จะใช้ข้อความนั้นบนปุ่มหรือเป็นป้ายกำกับเป็นต้น
Satyam

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

ฉันสร้างextensionไปStringตั้งแต่ฉันได้จำนวนมากจะเป็น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...จะไม่หยิบขึ้นมา
Jason Moore

จากสิ่งที่ @JasonMoore แนะนำฉันไม่คิดว่านี่เป็นแนวทางที่ถูกต้อง
Yuchen Zhong

@JasonMoore เห็นด้วยอย่างยิ่งกับคุณ พวกคุณพบวิธีแก้ปัญหานี้หรือไม่?
gasparuff

ฉันไม่รู้ว่าทำไมวิธีแก้ปัญหานี้จึงลดลง :( และเกือบรังด้านล่างวิธีแก้ปัญหาเหมือนกัน แต่มีอัตราสูงขึ้น
Amr Angry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.