簡體   English   中英

使用包裝的語言資源Xamarin Forms更改語言運行時

[英]Change language runtime with wrapped language resources Xamarin Forms

我們正在開發幾個移動應用程序,它們之間具有Common .NET Standard庫,該庫具有通用功能。 (MVVM)Common項目具有一個TranslationManager類和一個Resource文件,其中包含公共翻譯。 TranslationManager使用構造函數注入,以注入應用程序特定的翻譯資源。

    public TranslationManager(ResourceManager appSpecificLanguageResources)
    {
        _commonResources = CommonTranslationResources.ResourceManager;
        _appSpecificLanguageResources = appSpecificLanguageResources;
    }

使用此代碼,我們可以僅使用一個翻譯提供程序來使用常見翻譯和特定於應用程序的翻譯。

            if (string.IsNullOrWhiteSpace(translationKey))
                return null;
            string commonTranslation = _commonResources.GetString(translationKey, new CultureInfo(_preferenceCache.CultureName));
            string appSpecificTranslation = _appSpecificLanguageResources.GetString(translationKey, new CultureInfo(_preferenceCache.CultureName));
            if (commonTranslation == null && appSpecificTranslation == null)
            {
                MobileLogger.Instance.LogWarning($"Translate could not found by translationKey: {translationKey}");
                return $"TRANSLATION_{translationKey}";
            }
            if (!string.IsNullOrWhiteSpace(commonTranslation) && !string.IsNullOrWhiteSpace(appSpecificTranslation))
            {
                MobileLogger.Instance.LogDebug(TAG, $"Warning! Duplicate translate found for '{translationKey}' translationkey. Common translate is : '{commonTranslation}' , AppSpecific Translation is: {appSpecificTranslation}. Returning with appspecific translation.");
                return appSpecificTranslation;
            }
            if (commonTranslation == null)
                return appSpecificTranslation;
            else
                return commonTranslation;

在XAML中,我們有一個MarkupExtension,它提供了當前語言的翻譯。

public class TranslateMarkupExtension : IMarkupExtension
{
    public TranslateMarkupExtension()
    {

    }

    public string TranslationKey { get; set; }

    public object ProvideValue(IServiceProvider serviceProvider)
    {
        if (string.IsNullOrWhiteSpace(TranslationKey)) return "nullref";
        return Resolver.Resolve<TranslationManager>().GetTranslationByKeyForCurrentCulture(TranslationKey);
    }
}

XAML用法似乎是這樣的:

  Entry Placeholder="{extensions:TranslateMarkup TranslationKey=PlaceholderPhoneNumber}"

問題是,當我在運行時設置語言時,翻譯擴展標記不會評估新翻譯。

提高使用null參數更改的屬性會刷新視圖上的綁定,但不會影響MarkupExtensions。

我不想將同一頁面推送到導航堆棧,對我來說似乎是拼湊而成。

問題是,當我在運行時設置語言時,翻譯擴展標記不會評估新翻譯。

您可能需要為TranslationManager使用INotifyPropertychanged接口,當您更改UI區域性時,綁定到索引的所有字符串都會更新。

更詳細的信息,請參考:

Xamarin.Forms在運行時(XAML)更改UI語言

public class TranslateExtension : IMarkupExtension<BindingBase>
{       
    public TranslateExtension(string text)
    {
        Text = text;            
    }

    public string Text { get; set; }

    object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
    {
        return ProvideValue(serviceProvider);
    }

    public BindingBase ProvideValue(IServiceProvider serviceProvider)
    {
        var binding = new Binding
        {
            Mode = BindingMode.OneWay,
            Path = $"[{Text}]",
                Source = Translator.Instance,
        };
    return binding;
    }        
}

這是最初提出的Translator類,但為了清晰起見,在此處通過GetString調用進行了復制:

public class Translator : INotifyPropertyChanged
{
    public string this[string text]
    {
    get
    {
        return Strings.ResourceManager.GetString(text, Strings.Culture);
    }
    }        

    public static Translator Instance { get; } = new Translator();

    public event PropertyChangedEventHandler PropertyChanged;

    public void Invalidate()
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(null));
    }
}

用以下方式綁定文本:

{i18n:Translate Label_Text}

要觸發語言更新,您只需致電:

Translator.Instance.Invalidate()

解決方案來自: https : //forums.xamarin.com/discussion/82458/binding-indexername-and-binding-providevalue-in-xamarin-forms

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM