NSLocalizedString với biến nhanh


85

Tôi đang cố gắng bản địa hóa ứng dụng của mình bằng NSLocalizedString. Khi tôi nhập tệp XLIFF, hầu hết hoạt động giống như một charm nhưng một số thì không và một số chuỗi không được bản địa hóa. Tôi nhận thấy rằng vấn đề là do NSLocalizedString có chứa một số biến bên trong như:

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

hoặc là

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

Có thể đây không phải là cú pháp chính xác cho loại công cụ này. Ai đó có thể giải thích cho tôi cách làm điều đó nhanh chóng? Cảm ơn rât nhiều.


Đây là một bài viết rất hay về bản địa hóa trong Swift để có một kiến ​​trúc mạnh mẽ
Mendy

Câu trả lời:


133

Bạn có thể sử dụng các sprintftham số định dạng bên trong NSLocalizedString, vì vậy ví dụ của bạn có thể trông giống như sau:

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

6
Nó trông như thế nào trong Localizable.string
Van Du Tran

giống như trong obj-C:" - %d Notifica"=" - %d Notifica";
ReDetection,

3
Làm cách nào để thay thế một chuỗi? Tôi cố gắng để sử dụng %ssửa đổi mà không làm việc = \
igrek

12
@igrek Sử dụng %@để thay thế một chuỗi.
Yeehaw 14/02/17

2
Các tài liệu tham khảo cho các thông số định dạng là developer.apple.com/library/content/documentation/Cocoa/...
Shaun Dychko

94

Trong Phiên # 412 của WWDC2014 "Bản địa hóa với Xcode 6", cách thích hợp để thực hiện việc này trong Swift như sau:

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

Tại sao bạn cần sử dụng NSLocalizedString (...)? nó không xảy ra trong việc triển khai String.localizedStringWithFormat (...)?
Yitzchak


1
Cảm ơn tôi đã xem nó sau khi tôi hỏi. Nó sẽ rất hữu ích cho những người khác vì vậy cảm ơn
Yitzchak

25

Tôi đã làm theo cách tiếp cận tạo phần mở rộng cho Chuỗi vì tôi có nhiều chuỗi để bản địa hóa.

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

Để sử dụng nó cho bản địa hóa trong mã, hãy làm:

self.descriptionView.text = "Description".localized

Đối với chuỗi có biến động, hãy làm theo:

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

Khai báo các chuỗi trong tệp Chuỗi cho các ngôn ngữ khác nhau (ví dụ: tiếng Ả Rập và tiếng Anh)

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Hy vọng sẽ được giúp đỡ!


2
Nhưng đối với tôi, có vẻ như bạn chỉ gắn thời gian vào chuỗi. Điều gì sẽ xảy ra nếu chuỗi được bản địa hóa của bạn như thế The doors open at %@ o'clock. Giải pháp của bạn vẫn hoạt động chứ?
Houman

Vâng, nó đang hoạt động hoàn hảo vì tôi đang có thời gian như Chuỗi từ phía sau.
JaspreetKour

1
Cảm ơn đã bao gồm một tham chiếu đến Localizable.strings. Tuy nhiên, tôi nghĩ @Houman có một mối quan tâm hợp lệ.
Matt

Tôi không biết tại sao mọi người lại muốn bỏ giá trị "bình luận". Nó cung cấp mô tả của văn bản và mục đích của nó cho các kỹ sư bản địa hóa mà không có nó, họ không thể có ý định sử dụng văn bản đó trên một nút hoặc làm nhãn, v.v.
Satyam

7

Đây là một phần mở rộng tôi sử dụng trong String, nó thêm một hàm localizeWithFormat với các đối số biến,

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

Sử dụng:

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)

Chỉ cần lưu ý không sử dụng cùng một hàm và tên thuộc tính mà String có. Tôi thường sử dụng tiền tố 3 chữ cái cho tất cả các chức năng khung của mình.


7

Tôi đã thử các giải pháp trên tuy nhiên mã bên dưới phù hợp với tôi

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? \"%@\"";

-5

Tôi tạo ra một extensionđến Stringkể từ khi tôi có rất nhiều stringsđể được localized.

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

Ví dụ:

let myValue = 10
let anotherValue = "another value"

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

6
Nhược điểm lớn của phương pháp này là bạn phải trích xuất các chuỗi theo cách thủ công để gửi đến trình dịch vì Editor > Export for Localization...sẽ không nhận chúng.
Jason Moore

Với những gì @JasonMoore đề xuất, tôi không nghĩ đây là cách tiếp cận đúng.
Yuchen Zhong

@JasonMoore hoàn toàn đồng ý với bạn. Có ai trong số các bạn tìm thấy một giải pháp cho điều này?
gasparuff

tôi không biết tại sao giải pháp này được downrated :( và gần như dưới đây làm tổ dưới đây giải pháp là như nhau nhưng nó có uprate.
Amr Angry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.