NSLocalizedString तेज चर के साथ


85

मैं 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")

हो सकता है कि यह इस तरह के सामान के लिए सही वाक्यविन्यास नहीं है। कोई मुझे समझा सकता है कि मैं स्विफ्ट में कैसे करूं? आपका बहुत बहुत धन्यवाद।


एक मजबूत वास्तुकला के लिए स्विफ्ट में स्थानीयकरण के बारे में यह एक बहुत अच्छा लेख है
मेंडी

जवाबों:


133

आप sprintfप्रारूप मापदंडों का उपयोग कर सकते हैं NSLocalizedString, इसलिए आपका उदाहरण इस तरह दिख सकता है:

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

6
स्थानीयकरण में यह कैसा दिखता है। स्ट्रिंग
वैन डू ट्रान

" - %d Notifica"=" - %d Notifica";
ओब्ज

3
मैं एक स्ट्रिंग कैसे प्रतिस्थापित करूं? मैंने %sउस संशोधक का उपयोग करने की कोशिश की जो
igrek

12
@igrek %@एक स्ट्रिंग को प्रतिस्थापित करने के लिए उपयोग करें ।
येवह

2
इन फ़ॉर्मेटिंग पैरामीटर्स का संदर्भ डेवलपर
.apple.com/library/content/documentation/Cocoa/…

94

WWDC2014 के सत्र # 412 में "Xcode 6 के साथ स्थानीयकरण" स्विफ्ट में इसका उचित तरीका निम्नलिखित है:

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

आपको NSLocalizedString (...) का उपयोग करने की आवश्यकता क्यों है? क्या यह String.localizedStringWithFormat (...) के कार्यान्वयन में नहीं होता है?
यिट्ज़चेक

2
बाहर की जाँच करें ( stackoverflow.com/questions/26237549/… )
मार्क

1
धन्यवाद मैंने पहले ही पूछ लिया था कि मैंने पूछा था। यह बहुत धन्यवाद दूसरों के लिए बहुत उपयोगी हो जाएगा
Yitzchak

25

मैंने स्ट्रिंग का विस्तार करने के दृष्टिकोण का पालन किया है क्योंकि मेरे पास स्थानीयकरण के कई तार हैं।

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। क्या आपका समाधान अभी भी काम करेगा?
होउमैन

हां, यह पूरी तरह से काम कर रहा है क्योंकि मुझे पीछे से स्ट्रिंग के रूप में समय मिल रहा है।
जसप्रीतकौर

1
के लिए एक संदर्भ शामिल करने के लिए धन्यवाद Localizable.strings। हालांकि, मुझे लगता है कि @ हौमान को एक वैध चिंता है।
मैट

मुझे नहीं पता कि लोग "टिप्पणी" मूल्य को क्यों छोड़ना चाहते हैं। यह स्थानीयकरण इंजीनियरों को पाठ और उसके उद्देश्य का विवरण देता है, जिसके बिना वे एक बटन पर या एक लेबल आदि के रूप में उस पाठ का उपयोग करने का इरादा नहीं बना सकते हैं
सत्यम

7

मैंने उपरोक्त समाधानों की कोशिश की हालांकि नीचे दिए गए कोड ने मेरे लिए काम किया

स्विफ्ट 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? \"%@\"";

6

स्ट्रिंग में मैं यहां एक एक्सटेंशन का उपयोग कर रहा हूं, यह चर तर्क के साथ एक स्थानीयकरणस्मार्ट फ़ंक्शन जोड़ता है,

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)

बस उसी फ़ंक्शन और संपत्ति के नामों का उपयोग करने के लिए सावधान रहें जो स्ट्रिंग के पास हैं। मैं आमतौर पर अपने सभी ढांचे के कार्यों के लिए एक 3 अक्षर उपसर्ग का उपयोग करता हूं।


-5

मैं एक extensionके Stringबाद से मैं कई होने के stringsलिए बनाया है localized

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 ने जो सुझाव दिया, उसे देखते हुए मुझे नहीं लगता कि यह सही तरीका है।
युचेन झोंग

@JasonMoore आपसे पूरी तरह सहमत हैं। क्या आप में से किसी ने इसके लिए कोई समाधान खोजा?
गैसपरफ

मुझे नहीं पता कि यह घोल क्यों गिराया गया है :(? और लगभग नीचे के घोल से नीचे का घोल एक ही है, लेकिन यह उखड़ा हुआ है
अमृत ​​एंग्री
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.