WinUI 3 के लिए अंतर्राष्ट्रीयकरण विकल्प

WinUI 3 अंतर्राष्ट्रीयकरण को पूरी तरह से समर्थित करता है। फिर भी, वर्तमान में सबसे विश्वसनीय तरीका यह है कि भाषा बदलने के बाद एप्लिकेशन को पुनरारंभ करें ताकि डिस्प्ले सही तरीके से काम करे। हालांकि तकनीकी रूप से बिना पुनरारंभ के इंटरफ़ेस की भाषा को गतिशील रूप से अपडेट करना संभव है, लेकिन इसका कार्यान्वयन बहुत जटिल हो जाता है। मैंने इस मुद्दे पर लंबा समय दिया और भाषा बदलने के बाद टेक्स्ट विकृत होने या ऐप के क्रैश होने जैसी कई समस्याओं का सामना किया। कई प्रयासों और सुधारों के बाद, मैंने WinUI 3 के लिए एक स्थिर अंतर्राष्ट्रीयकरण वर्कफ़्लो बनाया है, जिसे नीचे विस्तार से बताया गया है।

सबसे पहले, App.xaml.cs के कोड बिहाइंड में भाषा आरंभिकरण लॉजिक जोड़ें। यदि उपयोगकर्ता ने कोई कस्टम भाषा नहीं चुनी है, तो एप्लिकेशन ऑपरेटिंग सिस्टम की डिफ़ॉल्ट भाषा का उपयोग करेगा। यदि सिस्टम भाषा समर्थित सूची में नहीं है, तो ऐप अंग्रेजी पर स्विच हो जाएगा।

protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
    const string LangSettingKey = "AppLanguageCode";
    // All supported language tags of project
    List<string> supportLangs = new() { "zh-CN", "en-US", "th-TH" };
    string finalLang = "en-US"; // Default language

    try
    {
        var localSetting = ApplicationData.Current.LocalSettings;

        // ① Use saved language if local configuration exists
        if (localSetting.Values.TryGetValue(LangSettingKey, out var savedVal))
        {
            finalLang = NormalizeLang(savedVal?.ToString() ?? "");
        }
        else
        {
            // ② No saved config: read system primary preferred language
            string sysLang = ApplicationLanguages.Languages.FirstOrDefault() ?? "";
            sysLang = NormalizeLang(sysLang);

            // ③ Use system language if supported, otherwise fall back to English
            finalLang = supportLangs.Contains(sysLang) ? sysLang : "en-US";
        }
    }
    catch
    {
        // Ignore exception when running unpackaged, ApplicationData unavailable
    }

    ApplicationLanguages.PrimaryLanguageOverride = finalLang;

    _window = new MainWindow();
    _window.Activate();
}

/// <summary>
/// Standardize culture code: map system returned zh-Hans-CN to zh-CN
/// </summary>
private static string NormalizeLang(string lang)
{
    if (string.IsNullOrEmpty(lang)) return lang;

    return lang switch
    {
        "zh-Hans-CN" => "zh-CN",
        "zh-Hant-TW" => "zh-TW", // For future Traditional Chinese support
        _ => lang
    };
}Code language: PHP (php)

इस कॉन्फ़िगरेशन को और बेहतर बनाया जा सकता है। कोड को साफ रखने के लिए समर्थित भाषाओं की सूची को यहां हार्डकोड न करें। इसे एक स्टैटिक हेल्पर क्लास में रखें ताकि भाषा सेटिंग प्रबंधित करने वाले सभी स्थानों पर एक ही सूची का पुनः उपयोग किया जा सके।

    public class Languages
    {
        public static List<string> supportLangs = new() { "zh-CN", "en-US", "th-TH" };
    }Code language: PHP (php)

उपरोक्त कोड ब्लॉक का मुख्य कार्य ऐप प्रारंभ होने पर भाषा सेट करना है: पहले उपयोगकर्ता की सहेजी गई भाषा वरीयता लोड करें, कस्टम सेटिंग न होने पर सिस्टम की डिफ़ॉल्ट भाषा का उपयोग करें और अंतिम बैकअप के रूप में अंग्रेजी का उपयोग करें।

भाषा बदलने के लिए समर्पित पृष्ठ बनाएं

उपयोगकर्ताओं को डिस्प्ले भाषा बदलने के लिए एक अलग इंटरफ़ेस चाहिए, इसलिए मैंने भाषा कॉन्फ़िगरेशन के लिए एक स्वतंत्र पृष्ठ बनाया है।

<?xml version="1.0" encoding="utf-8"?>
<Page
    x:Class="ThaiTong.Pages.LanguageSettingPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:ThaiTong.Pages"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    mc:Ignorable="d">
    <StackPanel Padding="20" Spacing="24">
        <TextBlock x:Uid="Txt_LangTip" FontSize="22"/>

        <ComboBox x:Name="cbLangSelect" Width="320" Height="40" CornerRadius="6">
            <ComboBoxItem Tag="zh-CN" Content="简体中文"/>
            <ComboBoxItem Tag="en-US" Content="English"/>
            <ComboBoxItem Tag="th-TH" Content="ภาษาไทย"/>
        </ComboBox>

        <StackPanel Orientation="Horizontal" Spacing="12">
            <Button x:Name="btnSave" x:Uid="Btn_Save" Content="Save" Click="BtnSave_Click" Width="120" Height="38" CornerRadius="5"/>
        </StackPanel>

        <TextBlock Foreground="Gray" Text="Note: After saving, page will refresh to apply language."/>
    </StackPanel>
</Page>
Code language: HTML, XML (xml)

संबंधित बैकएंड C# कोड नीचे दिया गया है:

using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using Microsoft.Windows.ApplicationModel.Resources;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using ThaiTong.Common;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Globalization;
using Windows.Storage;

// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.

namespace ThaiTong.Pages
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class LanguageSettingPage : Page
    {

        private const string LangSettingKey = "AppLanguageCode";
        private string _currentLang;

        private readonly ResourceLoader _resLoader;

        public LanguageSettingPage()
        {
            InitializeComponent();
            _resLoader = new ResourceLoader();

            var setting = ApplicationData.Current.LocalSettings;
            if (setting.Values.TryGetValue(LangSettingKey, out var saveLang))
            {
                _currentLang = saveLang.ToString();
            }
            else
            {
                string sysLang = ApplicationLanguages.Languages.FirstOrDefault() ?? "";
                _currentLang = Languages.supportLangs.Contains(sysLang) ? sysLang : "en-US";
            }

            // Pre-select matched language in dropdown list
            foreach (var item in cbLangSelect.Items)
            {
                if (item is ComboBoxItem cbi && cbi.Tag.ToString() == _currentLang)
                {
                    cbLangSelect.SelectedItem = item;
                    break;
                }
            }
        }

        // Save selected language setting
        private async void BtnSave_Click(object sender, RoutedEventArgs e)
        {
            if (cbLangSelect.SelectedItem is not ComboBoxItem selectItem) return;
            string newLang = selectItem.Tag.ToString();
            if (_currentLang == newLang) return;

            ApplicationData.Current.LocalSettings.Values[LangSettingKey] = newLang;
            _currentLang = newLang;
            ApplicationLanguages.PrimaryLanguageOverride = newLang;

            // Load localized text from resw resource file
            ContentDialog tipDialog = new ContentDialog()
            {
                XamlRoot = this.XamlRoot,
                Title = _resLoader.GetString("Dlg_LangChange_Title"),
                Content = _resLoader.GetString("Dlg_LangChange_Content"),
                CloseButtonText = _resLoader.GetString("Dlg_LangChange_BtnOk")
            };
            await tipDialog.ShowAsync();
        }


    }
}
Code language: HTML, XML (xml)

जब भी उपयोगकर्ता नई भाषा सेटिंग सहेजता है, तो हम ऐप को पुनरारंभ करने का संकेत देते हैं ताकि इंटरफ़ेस का पूरा टेक्स्ट पूरी तरह से अपडेट हो जाए।

WinUI 3 का स्थानीयकरण कार्यान्वयन दो भागों में विभाजित है: XAML फ़ाइलों के अंदर मार्कअप और C# बैकएंड कोड में टेक्स्ट पढ़ने की प्रक्रिया।

XAML एलिमेंट्स के लिए उदाहरण के अनुसार x:Uid एट्रिब्यूट का उपयोग करें:

<TextBlock x:Uid="Txt_LangTip" FontSize="22"/>Code language: HTML, XML (xml)

इसके बाद स्थानीयकरण संसाधन फ़ोल्डर संरचना बनाएं: प्रोजेक्ट रूट में Strings नाम का फ़ोल्डर बनाएं, फिर प्रत्येक संस्कृति कोड के अनुसार सबफ़ोल्डर जोड़ें, जैसे en-US अमेरिकी अंग्रेजी के लिए। प्रत्येक भाषा फ़ोल्डर में Resources.resw फ़ाइल बनाएं और अनुवाद के लिए कुंजी-मान जोड़े रखें।

  <data name="Btn_Save.Content" xml:space="preserve">
      <value>सहेजें</value>
  </data>Code language: HTML, XML (xml)

नाम फ़ील्ड खोज कुंजी के रूप में कार्य करता है। प्रत्यय .Content लक्ष्य नियंत्रण गुण को इंगित करता है। पहले उल्लिखित Txt_LangTip को इस प्रकार परिभाषित किया जाता है:

<data name="Txt_LangTip.Text" xml:space="preserve"><value>ऐप्लिकेशन भाषा चुनें</value></data>Code language: HTML, XML (xml)

यहां .Text जोड़ा गया है क्योंकि हम विशेष रूप से TextBlock नियंत्रण के Text गुण को लक्षित कर रहे हैं।

C# कोड के अंदर गतिशील टेक्स्ट के लिए पहले ResourceLoader का इंस्टेंस प्रारंभ करें:

 private readonly ResourceLoader _resLoader;

 public LanguageSettingPage()
 {
     InitializeComponent();
     _resLoader = new ResourceLoader();Code language: PHP (php)

प्रारंभिकरण के बाद आप GetString विधि का उपयोग करके कोड के किसी भी स्थान पर स्थानीयकृत स्ट्रिंग प्राप्त कर सकते हैं:

Title = _resLoader.GetString("Dlg_LangChange_Title"),Code language: JavaScript (javascript)

प्रातिक्रिया दे

आपका ईमेल पता प्रकाशित नहीं किया जाएगा. आवश्यक फ़ील्ड चिह्नित हैं *