फ़्रेमवर्क की स्थानीयकरण कुंजी को हल करने के लिए, उसका संसाधन बंडल और स्ट्रिंग्स टेबल, दोनों पास करें। यह गाइड दिखाती है कि Mac ऐप में फ़्रेमवर्क के स्वामित्व वाला लेबल सही ढंग से कैसे दिखाएँ, फिर जाँचें कि परिणाम फ़ॉलबैक टेक्स्ट के बजाय टेबल से आया है।
यह काम जान-बूझकर छोटा रखा गया है: फ़्रेमवर्क के Panel.xcstrings कैटलॉग से कृत्रिम लेबल Open panel दिखाएँ। आपको Xcode में Mac ऐप प्रोजेक्ट और ऐसा फ़्रेमवर्क टारगेट चाहिए जिस पर आपका नियंत्रण हो। मुख्य उदाहरण Xcode 26 या उसके बाद के संस्करण का उपयोग करता है और macOS 12 या उसके बाद के संस्करण को टारगेट करता है; Apple स्थानीयकृत स्ट्रिंग इनिशियलाइज़र को macOS 12 से उपलब्ध बताता है। Swift इनिशियलाइज़र का दस्तावेज़।
कोड बदलने से पहले बंडल, टेबल और कुंजी पहचानें
स्थानीयकृत संदेश को तीन स्पष्ट निर्देशांकों वाले लुकअप के रूप में देखें। बंडल संसाधन के स्वामी की पहचान करता है, टेबल उस बंडल के भीतर स्ट्रिंग्स के समूह की पहचान करती है, और कुंजी उस टेबल के भीतर प्रविष्टि की पहचान करती है। Apple के स्थानीयकरण API बंडल और टेबल को अलग-अलग रखते हैं, क्योंकि फ़्रेमवर्क और ऐप टारगेट—दोनों में स्ट्रिंग संसाधन हो सकते हैं। अपने ऐप के टेक्स्ट को अनुवाद के लिए तैयार करना।
इस उदाहरण के लिए, कैटलॉग खोलने से पहले यह अनुबंध लिख लें। ये उदाहरण के नाम हैं, Apple द्वारा अनिवार्य नाम नहीं।
| हिस्सा | उदाहरण मान | उद्देश्य |
|---|---|---|
| संसाधन का स्वामी | आपका फ़्रेमवर्क टारगेट | कैटलॉग शामिल करता है |
| कैटलॉग फ़ाइल | Panel.xcstrings |
टेबल का मूल टेक्स्ट और अनुवाद संग्रहीत करती है |
| टेबल आर्ग्युमेंट | Panel |
एक्सटेंशन के बिना उस कैटलॉग को चुनता है |
| कुंजी | PANEL_OPEN_ACTION |
संदेश की पहचान करती है |
| अंग्रेज़ी मूल मान | Open panel |
पढ़ने योग्य इंटरफ़ेस टेक्स्ट देता है |
| टिप्पणी | पैनल खोलने वाली कार्रवाई के लेबल के लिए। |
संदेश का उपयोग समझाती है |
table: \"Panel\" पास करने से Panel.xcstrings द्वारा दर्शाई गई टेबल चुनी जाती है। टेबल सेट न करने पर Localizable चुनी जाती है। इसी तरह, बंडल सेट न करने पर स्ट्रिंग इनिशियलाइज़र मुख्य ऐप बंडल में खोज करता है। इसलिए फ़्रेमवर्क कैटलॉग में मौजूद कुंजी के लिए फ़्रेमवर्क का बंडल और सही टेबल, दोनों चाहिए। Swift स्थानीयकृत स्ट्रिंग पैरामीटर।
इससे एक उपयोगी निदान क्रम मिलता है: पहले स्वामी जाँचें, फिर टेबल, और अंत में प्रविष्टि। यदि संदेश फ़्रेमवर्क का है, लेकिन लुकअप ऐप के संसाधनों को देख रहा है, तो कुंजी की दूसरी वर्तनी खोजने से समस्या हल नहीं होगी।
फ़्रेमवर्क टारगेट में स्ट्रिंग कैटलॉग जोड़ें
Xcode में File > New > File from Template चुनें, प्लेटफ़ॉर्म चुनें, string फ़िल्टर करें और String Catalog चुनें। फ़ाइल का नाम Panel रखें। सुनिश्चित करें कि कैटलॉग उसी फ़्रेमवर्क टारगेट का हिस्सा है जिसमें वह फ़्रेमवर्क सोर्स भी है जो इसका संदर्भ देगा। Apple के कैटलॉग वर्कफ़्लो में कस्टम कैटलॉग नाम रखे जा सकते हैं, और उसके फ़्रेमवर्क प्रदर्शन में कैटलॉग फ़्रेमवर्क टारगेट के भीतर बनाया गया है। स्ट्रिंग कैटलॉग से टेक्स्ट का स्थानीयकरण और रूपांतरण, Apple का फ़्रेमवर्क स्थानीयकरण प्रदर्शन।
यह उदाहरण दिखाए जाने वाले शब्दों को ही कुंजी बनाने के बजाय अर्थपूर्ण कुंजी का उपयोग करता है। पहचानकर्ता के रूप में PANEL_OPEN_ACTION और डिफ़ॉल्ट मान के रूप में Open panel रखने से कोड दोनों को स्पष्ट रूप से बताता है। Apple ऐसे इनिशियलाइज़र के ज़रिए इस व्यवस्था का समर्थन करता है जो स्थिर कुंजी और अलग डिफ़ॉल्ट स्थानीयकरण मान स्वीकार करता है। Swift स्थिर-कुंजी इनिशियलाइज़र।
नीचे दिया गया सोर्स जोड़ने के बाद फ़्रेमवर्क टारगेट बनाएँ। बिल्ड के दौरान Xcode स्थानीयकृत API कॉल खोजता है और संबंधित कैटलॉग अपडेट करता है। Panel.xcstrings खोलकर जाँचें कि उसमें PANEL_OPEN_ACTION, अंग्रेज़ी मूल मान Open panel और व्याख्यात्मक टिप्पणी मौजूद हैं। यदि प्रविष्टि नहीं है, तो सोर्स की टारगेट सदस्यता जाँचें और देखें कि उस सोर्स वाले टारगेट को बनाया गया था या नहीं। Apple कैटलॉग प्रविष्टि से जुड़े कोड को देखने के लिए Editor > Assistant भी उपलब्ध कराता है। स्ट्रिंग कैटलॉग भरें और उसकी जाँच करें।
फ़्रेमवर्क के भीतर संदेश हल करें
इस पूरी सोर्स फ़ाइल को फ़्रेमवर्क टारगेट में रखें। यह स्थानीयकृत स्ट्रिंग और एक छोटा SwiftUI लेबल परिभाषित करती है, जिसे कंटेनिंग Mac ऐप दिखा सकता है। इसमें अगले सेक्शन में उपयोग की जाने वाली निदान विधि भी शामिल है। कोड को Apple के दस्तावेज़ित सिग्नेचर के अनुसार जाँचा गया था; यहाँ इसे चलाया नहीं गया, क्योंकि Swift कंपाइलर उपलब्ध नहीं था।
import Foundation
import SwiftUI
public enum PanelMessages {
public static var openPanel: String {
String(
localized: "PANEL_OPEN_ACTION",
defaultValue: "Open panel",
table: "Panel",
bundle: #bundle,
comment: "Label for the action that opens the panel."
)
}
public static func lookupReport() -> String {
let missingMarker = "__PANEL_LOOKUP_MISSING__"
let result = #bundle.localizedString(
forKey: "PANEL_OPEN_ACTION",
value: missingMarker,
table: "Panel"
)
if result == missingMarker {
return "No entry resolved from the selected bundle and table."
}
return "Resolved table value: \(result)"
}
}
public struct PanelActionLabel: View {
public init() {}
public var body: some View {
Text(verbatim: PanelMessages.openPanel)
}
}
#bundle एक्सप्रेशन का मूल्यांकन वहीं होता है जहाँ आप इसे लिखते हैं। इस फ़्रेमवर्क सोर्स के भीतर, यह फ़्रेमवर्क टारगेट से जुड़ा बंडल देता है। यदि आप यही एक्सप्रेशन ऐप टारगेट के सोर्स में ले जाएँ, तो यह ऐप का बंडल देगा। Swift पैकेज टारगेट के लिए Apple दस्तावेज़ बताता है कि यह मैक्रो टारगेट का संसाधन बंडल देता है। लुकअप को उसी जगह रखें जहाँ उसके स्वामित्व वाले संसाधन हैं। Foundation का बंडल मैक्रो।
यह घोषणा एक साधारण String लौटाती है जिसका स्थानीयकरण पहले ही हल हो चुका है। व्यू उस परिणाम को स्पष्ट रूप से दिखाने के लिए Text(verbatim:) का उपयोग करता है। सार्वजनिक व्यू केवल एक लेबल है; टेक्स्ट जहाँ दिखाना हो, उसे मौजूदा ऐप व्यू में जोड़ें।
जब बंडल मैक्रो उपलब्ध न हो, तो फ़्रेमवर्क क्लास का उपयोग करें
Apple फ़्रेमवर्क में परिभाषित क्लास के ज़रिए फ़्रेमवर्क बंडल ढूँढ़ने का विकल्प भी देता है। ऐसे पारंपरिक फ़्रेमवर्क के लिए जिसमें अपने संसाधन हों, नीचे दिया गया कोड संदेश उपलब्ध कराने का पूरा विकल्प है। इसे पहले वाली PanelMessages घोषणा की जगह उपयोग करें और ऊपर बताई गई कैटलॉग तथा डिप्लॉयमेंट आवश्यकताएँ बनाए रखें।
import Foundation
private final class PanelBundleAnchor: NSObject {}
public enum PanelMessages {
public static var openPanel: String {
String(
localized: "PANEL_OPEN_ACTION",
defaultValue: "Open panel",
table: "Panel",
bundle: Bundle(for: PanelBundleAnchor.self),
comment: "Label for the action that opens the panel."
)
}
}
एंकर क्लास उसी फ़्रेमवर्क में कंपाइल होनी चाहिए जिसके संसाधन आप चाहते हैं। Apple दस्तावेज़ बताता है कि Bundle(for:) दी गई क्लास से जुड़ा बंडल लौटाता है, जिसमें लागू होने पर उसका फ़्रेमवर्क बंडल भी शामिल है। ऐप में कंपाइल किया गया एंकर ऐप की पहचान करेगा। पैकेज संसाधनों या अलग बंडल में रखे संसाधनों के लिए उनका वास्तविक संसाधन बंडल चुनें; केवल क्लास की जगह से उन संसाधनों का स्वामित्व तय नहीं होता। बंडल का क्लास-आधारित इनिशियलाइज़र, मैक्रो से संसाधन बंडल चुनना।
साबित करें कि पढ़ने योग्य टेक्स्ट सफल लुकअप से आया है
स्क्रीन पर Open panel दिखना इस बात का पर्याप्त प्रमाण नहीं है कि कैटलॉग लुकअप सफल हुआ। लुकअप विफल होने पर इनिशियलाइज़र का defaultValue लौटाया जाता है, इसलिए एक ही दिखने वाला टेक्स्ट सफल लुकअप या फ़ॉलबैक—दोनों में से कुछ भी हो सकता है। पढ़ने योग्य इंटरफ़ेस टेक्स्ट के लिए यह व्यवहार उपयोगी है, लेकिन विकास के दौरान गलत बंडल या टेबल छिपा सकता है। Swift में डिफ़ॉल्ट मान का व्यवहार।
पहली सोर्स फ़ाइल की lookupReport() विधि इस अस्पष्टता को दूर करती है। यह एक विशिष्ट फ़ॉलबैक मार्कर के साथ लुकअप करती है, जिसे कैटलॉग के वास्तविक मान के रूप में इस्तेमाल नहीं किया जाना चाहिए। चल रहे ऐप या किसी मौजूदा डिबग संदर्भ से इसका लौटाया मान देखें। यदि यह बताती है कि कोई प्रविष्टि हल नहीं हुई, तो अनुवाद संपादित करने से पहले चुने गए संसाधनों की जाँच करें।
यह निदान Bundle.localizedString(forKey:value:table:) के दस्तावेज़ित व्यवहार से सीधे निकलता है: जब कुंजी मौजूद न हो और दिया गया फ़ॉलबैक खाली न हो, तो विधि वही फ़ॉलबैक लौटाती है। कुंजी मौजूद न होने पर, यदि फ़ॉलबैक nil या खाली हो, तो यह कुंजी लौटाती है। मार्कर से विफलता को वास्तविक मूल टेक्स्ट से अलग पहचानना आसान होता है। बंडल स्थानीयकृत स्ट्रिंग के लौटाए गए मान।
| दिखाई देने वाला परिणाम | अगली जाँच |
|---|---|
| निदान गुम प्रविष्टि का संदेश लौटाता है | पुष्टि करें कि कैटलॉग चुने गए बंडल में बनाया गया है, फिर Panel और PANEL_OPEN_ACTION जाँचें |
| निदान अनपेक्षित मान हल करता है | चुनी गई टेबल में उसी प्रविष्टि और मौजूदा रन में उपयोग की गई भाषा की जाँच करें |
| निदान सही ढंग से हल करता है, लेकिन इंटरफ़ेस अलग दिखता है | पता लगाएँ कि इंटरफ़ेस वास्तव में कौन-सा मान दिखा रहा है |
| अनुवादित रन के दौरान अंग्रेज़ी मूल मान दिखता है | प्रविष्टि का अनुवाद और रन कॉन्फ़िगरेशन जाँचें; सफल लुकअप से यह साबित नहीं होता कि अनुरोधित अनुवाद मौजूद है |
यह टेबल लुकअप अनुबंध से निकला समस्या-निवारण क्रम है। सफल मार्कर परीक्षण यह साबित करता है कि लुकअप ने कोई प्रविष्टि लौटाई, लेकिन इससे यह साबित नहीं होता कि हर समर्थित भाषा के लिए अनुवाद पूरा है। संसाधन समाधान और अनुवाद की पूर्णता को अलग-अलग जाँचें।
Mac ऐप की चुनी हुई भाषा में लेबल जाँचें
अतिरिक्त भाषाओं का समर्थन करने वाले ऐप के लिए, कैटलॉग साइडबार में संबंधित भाषा चुनें और उस प्रविष्टि के टेक्स्ट फ़ील्ड में अनुवाद दर्ज करें। फिर कंटेनिंग Mac ऐप के ज़रिए जाँचें। Apple कैटलॉग एडिटर में सीधे अनुवाद दर्ज करने का तरीका बताता है और काम करते समय प्रत्येक प्रविष्टि की अनुवाद स्थिति अपडेट करता है। स्ट्रिंग कैटलॉग में अनुवाद जोड़ें।
डिबग रन नियंत्रित करने के लिए Product > Scheme > Edit Scheme चुनें, Run चुनें और Options खोलें। App Language को प्रोजेक्ट द्वारा समर्थित भाषा पर सेट करें, एडिटर बंद करें और Mac ऐप फिर से चलाएँ। यदि आप चाहते हैं कि रन सिस्टम की भाषा सेटिंग का अनुसरण करे, तो System Language चुनें। ऐप चलाते समय स्थानीयकरणों की जाँच।
इस भाषा परीक्षण के विकल्प के रूप में स्ट्रिंग इनिशियलाइज़र का locale: आर्ग्युमेंट इस्तेमाल न करें। Apple दस्तावेज़ बताता है कि यह आर्ग्युमेंट इंटरपोलेट किए गए मानों, जैसे संख्याओं, का स्थानीयकरण नियंत्रित करता है; यह स्थानीयकृत स्ट्रिंग ढूँढ़ने के लिए उपयोग किया जाने वाला लोकेल नहीं बदलता। उदाहरण में इसे इसलिए छोड़ा गया है क्योंकि लेबल में कोई इंटरपोलेट किए गए मान नहीं हैं। Swift स्थानीयकृत स्ट्रिंग का locale पैरामीटर।
अंतिम अनुबंध छोटा और स्पष्ट रखें: Panel.xcstrings का स्वामी फ़्रेमवर्क है, लुकअप Panel चुनता है, और PANEL_OPEN_ACTION लेबल की पहचान करता है। निदान से प्रविष्टि सत्यापित करें, फिर ऐप की चुनी हुई रन भाषा में उसका दिखाया गया अनुवाद जाँचें। इस क्रम से आप संसाधन लुकअप पहले ठीक कर सकते हैं, ताकि ऐसे शब्दों पर समय न लगे जिन्हें ऐप शायद पढ़ ही नहीं रहा।
स्रोत
- अपने ऐप के टेक्स्ट को अनुवाद के लिए तैयार करना — Apple
- स्ट्रिंग कैटलॉग से टेक्स्ट का स्थानीयकरण और रूपांतरण — Apple
- कोड के साथ अभ्यास: Xcode में स्थानीयकरण देखें — Apple
init(localized:defaultValue:table:bundle:locale:comment:)— Appleinit(localized:table:bundle:locale:comment:)— Applebundle()— Appleinit(for:)— ApplelocalizedString(forKey:value:table:)— Apple- ऐप चलाते समय स्थानीयकरणों की जाँच — Apple