2015-02-16 4 views
10

मैं विजुअल स्टूडियो 2013 सीई के साथ Xamarin.Forms ऐप (पोर्टेबल क्लास लाइब्रेरी प्रोजेक्ट) विकसित कर रहा हूं। सबसे पहले मैं आईओएस संस्करण पर ध्यान केंद्रित कर रहा हूं।Xamarin.Forms: डिवाइस भाषा से स्वतंत्र स्थानीयकरण का उपयोग कैसे करें

अब मैं ऐप को बहुभाषी बनाने के बारे में सोच रहा हूं। मैंने इसके बारे में केवल ऑफिकल एक्समारिन दस्तावेज पढ़ा लेकिन मुझे एहसास हुआ कि यह समाधान केवल लक्ष्य डिवाइस की सिस्टम भाषा लेता है।

पोर्टेबल क्लास लाइब्रेरी में मेरे पास तीन भाषाओं के साथ एक संसाधन फ़ोल्डर है: जर्मन (डिफ़ॉल्ट), अंग्रेज़ी और फ्रेंच।

Resource.resx 
Resource.en-US.resx 
Resource.fr-FR.resx 
Resource.Designer.cs 

अब मैं सिर्फ एक स्थिर सेटिंग्स वर्ग जो इस तरह दिखता बनाया:

public static class Settings 
{ 
    public static Dictionary<String, CultureInfo> Languages = new Dictionary<String, CultureInfo> { { "German", new CultureInfo("de-DE") }, { "English", new CultureInfo("en-US") }, { "French", new CultureInfo("fr-FR") } }; 

    public static CultureInfo CurrentCulture = Languages["German"]; 
    public static CultureInfo CurrentUiCulture = Languages["German"]; 

    public static void ChangeCurrentCultureInfo(CultureInfo cultureInfo) 
    { 
     Resource.Culture = cultureInfo; 
    } 
} 

अब मेरे सवाल अगर यह आवेदन में संस्कृति को बदलने के लिए संभव है, जबकि एक बटन क्लिक के साथ क्रम। शायद

Settings.CurrentCulture = Settings.Languages["English"]; 
Settings.ChangeCurrentCultureInfo(Settings.CurrentCulture); 

की तरह कुछ किसी को भी मुझे बता सकते हैं करता है यह कैसे किया जा सकता है?

सादर

उत्तर

5

अंत में मुझे Xamarin समर्थन का उत्तर मिला। समाधान मैं कामों के बारे में सोच रहा था। पीसीएल में मेरे पास static Settings class है जो अलग-अलग CultureInfo ऑब्जेक्ट्स स्टोर करता है। इसके अलावा मैंने वर्तमान संस्कृति और संसाधन फ़ाइल की भाषा को बदलने के लिए एक विधि परिभाषित की है।

public static void ChangeCurrentCultureInfo(CultureInfo cultureInfo) 
{ 
    CurrentCulture = cultureInfo; 
    Resource.Culture = CurrentCulture; 
} 

यह महत्वपूर्ण था इससे पहले कि मैं मुख्य पृष्ठ प्रारंभ App() निर्माता में डिफ़ॉल्ट भाषा सेट करने के लिए। अब मुझे एक समर्थित घटना के साथ सभी समर्थित भाषाओं के साथ एक सूचीदृश्य मिला है जो ChangeCurrentCultureInfo विधि को कॉल करता है।

फिर भी मैं अपने समाधान प्रदान करने के लिए एंडी हूपर धन्यवाद देना चाहता हूं!

सम्मान

+0

संसाधन का अर्थ यहां क्या है? –

+1

@ EmrahAkgül मैंने अपना प्रश्न संपादित किया। संसाधन resx फ़ाइल है जो डिफ़ॉल्ट भाषा संग्रहीत करता है। – shinchillahh

+0

@yehe मुझे खेद है कि मैं कोड साझा नहीं कर सकता क्योंकि यह पुरानी नौकरी का एक प्रोजेक्ट है। = ( – shinchillahh

12

मैं आप अपने साझा पीसीएल परियोजना के भीतर से ऐसा कर सकते हैं विश्वास नहीं है। हालांकि, आप यूआईसील्चर को अपने प्लेटफार्म-विशिष्ट परियोजनाओं के भीतर से सेट कर सकते हैं। उपयोगी स्थान (यानी, आपके फॉर्म ऐप) से ऐसा करने के लिए, हमें इसे अपनी प्लेटफ़ॉर्म परियोजनाओं से निर्भरता के रूप में एक सेवा के रूप में बेनकाब करना होगा।

सबसे पहले, अपने संस्कृति प्रबंधन "सेवा" का वर्णन करने वाले इंटरफ़ेस को परिभाषित करें। यह एक विधानसभा है कि आपके प्लेटफ़ॉर्म-विशिष्ट परियोजनाओं द्वारा संदर्भित है में रहते हैं चाहिए (साझा पीसीएल परियोजना करना होगा):

:

public interface ICultureInfo 
{ 
    System.Globalization.CultureInfo CurrentCulture { get; set; } 
    System.Globalization.CultureInfo CurrentUICulture { get; set; } 
} 

और अपने मंच परियोजनाओं में से प्रत्येक में, एक प्रकार है कि है कि इंटरफ़ेस को लागू करता है शामिल

using System; 
using Xamarin.Forms; 
using System.Threading; 

[assembly:Dependency(typeof(YourNamespaceHere.PlatformCultureInfo))] 
namespace YourNamespaceHere 
{ 
    public class PlatformCultureInfo : ICultureInfo 
    { 
     #region ICultureInfo implementation 

     public System.Globalization.CultureInfo CurrentCulture { 
      get { 
       return Thread.CurrentThread.CurrentCulture; 
      } 
      set { 
       Thread.CurrentThread.CurrentCulture = value; 
      } 
     } 

     public System.Globalization.CultureInfo CurrentUICulture { 
      get { 
       return Thread.CurrentThread.CurrentUICulture; 
      } 
      set { 
       Thread.CurrentThread.CurrentUICulture = value; 
      } 
     } 

     #endregion 
    } 
} 

फिर अपने फॉर्म ऐप में, आप ज़ैमरिन फॉर्म निर्भरता सेवा से प्लेटफ़ॉर्म के कार्यान्वयन के उदाहरण का अनुरोध करते हैं। (नोट: DependencyService के लिए कोई भी कॉल Forms.Init के लिए एक कॉल के बाद होना चाहिए())

एक बार जब आप इसे पुनः प्राप्त करने के लिए, आप वर्तमान UI संस्कृति सेट कर सकते हैं:

var cultureInfo = Xamarin.Forms.DependencyService.Get<ICultureInfo>(); 
cultureInfo.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR"); 

एट देखा, में कोई भी परिवर्तन यूआई संस्कृति किसी भी बाद के संसाधन लुकअप के साथ दिखाई देगी। "बाद वाले" शब्द का उपयोग ध्यान दें - संसाधन लुकअप का उपयोग करने वाले किसी भी रूप (जैसे कि यदि आप my handy localization XAML markup extensions का उपयोग कर रहे हैं) तब तक संस्कृति परिवर्तन को प्रतिबिंबित नहीं करेंगे जब तक उन्हें रीफ्रेश/पुनः लोड नहीं किया जाता है।

समापन में, एक्समरिन टीम ने मूल संसाधन लुकअप इंफ्रास्ट्रक्चर को डुप्लिकेट करने का एक अच्छा काम किया! इसे ज़ैमरिन फॉर्म की दुनिया में लाने के लिए बस थोड़ा धक्का चाहिए।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद! मैं इसे आज़माउंगा! क्या आप मुझे बता सकते हैं कि एक दृश्य को रीफ्रेश/रीलोड कैसे करें? – shinchillahh

+2

सबसे आसान तरीका आपके ऐप के मुख्य पृष्ठ को पृष्ठ के एक नए उदाहरण में सेट करना होगा। यदि आप एमवीवीएम पैटर्न का उपयोग कर रहे हैं, तो आप ViewModel का पुनः उपयोग करके पेज के राज्य को सुरक्षित रख सकते हैं। –

+0

यह समाधान जावास्क्रिप्ट का अनुवाद करता है: शून्य (0) तो अपवाद फेंक दें? 'पकड़ो (अपवाद पूर्व) { डीबग। राइटलाइन (उदा। संदेश); } ' – rubStackOverflow

संबंधित मुद्दे