2016-11-23 47 views
2

我知道從.resw文件中引用本地化的字符串通常的方法是這樣的:使用字符串直接在XAML

XAML:

<Button x:Uid="ButtonUid" /> 

Resources.resw:

ButtonUid.Content = "Hello World" 

但是,它也有可能那種不喜歡這樣寫道:

XAML(僞代碼):

<Button Content = "$buttonLabel" /> 

Resources.resw:

buttonLabel = "Hello World" 

爲什麼我要做到像在第二exapmle的原因是因爲這是我移植自iOS和Android到WP的應用程序。我想將iOS或Android的字符串文件轉換爲.resw語法,但不需要遍歷每一個字符串,並添加.Content或.Text或任何它的用途。有沒有簡單的解決方案?

回答

2

我曾經做過類似的事情,我們在Android字符串資源文件中添加了任何新字符串,然後使用自定義構建工具將這些字符串轉換爲iOS和Windows格式。

版本的Android字符串可能是這樣的:

<string name="Hello">Hello, World!</string> 

我們的工具將其轉換成一個Windows字符串資源:

<data name="Hello"> 
    <value>Hello, World!</value> 
</data> 

接下來,添加一個轉換器,無助於提供 ,而是假定其參數是參數是資源ID:

public sealed class LocalizeConverter : IValueConverter 
{ 
    private static readonly ResourceLoader Loader = ResourceLoader.GetForViewIndependentUse("/Resources"); 

    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     string resourceId = parameter as string; 
     return !string.IsNullOrEmpty(resourceId) ? Loader.GetString(resourceId) : DependencyProperty.UnsetValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     throw new NotSupportedException(); 
    } 
} 

現在使可用的轉換器到你的XAML,或許是這樣的:

<Page.Resources> 
    <local:LocalizeConverter x:Key="LocalizeConverter" /> 
</Page.Resources> 

最後,設置你的ButtonContent屬性,如下所示:

<Button 
    Content="{x:Bind Converter={StaticResource LocalizeConverter}, ConverterParameter=Hello, Mode=OneTime}" 
/> 

請注意,我們不這樣做向轉換器提供任何值。 (在WPF中我會創建一個標記擴展,不幸的是,這個選項在UWP中是不可用的,所以我想出了這個無價值的轉換器選項作爲替代方案。)

如果你想要獲得更好的版本,考慮這個:

<Button 
    Content="{x:Bind Language, Converter={StaticResource LocalizeConverter}, ConverterParameter=Hello, Mode=OneWay}" 
/> 

這讓你可以隨時改變語言,如果你有資源本地化爲其他語言。 (注意:Mode=OneWay而不是Mode=OneTime

2

您可以使用CustomXamlResourceLoader:在你的App.xaml

public class XamlResourceLoader : CustomXamlResourceLoader 
{ 
    private readonly ResourceLoader _loader; 

    public XamlResourceLoader() 
    { 
     _loader = ResourceLoader.GetForViewIndependentUse(); 
    } 

    protected override object GetResource(string resourceId, string objectType, string propertyName, string propertyType) 
    { 
     return _loader.GetString(resourceId) ?? resourceId; 
    } 
} 

然後。CS構造:
CustomXamlResourceLoader.Current = new XamlResourceLoader();

在XAML

最後:
<Button Content = "{CustomResource buttonLabel}" />

相關問題