当前位置:网站首页 / WPF / 正文

AY GITHUB WPF TECH APPLY 1 - Gu.Localization和Fody引入

时间:2019年08月23日 | 作者 : aaronyang | 分类 : WPF | 浏览: 516次 | 评论 0

把国外的好的关于WPF技术的Github项目分解,带给国内人欣赏和学习使用

image.png

安装下

image.png

右键增加

image.png



文件命名方式:Resources.<tag>.resx

<tag> 的说明:https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c

image.png

我直接添加了Resource.zh-Hans.resx 一个中文包

image.png

然后我们加一个韩语的 ko

image.png

image.png

接下来我们打开Resources.resx,加一个字段

image.png

然后打开MainWindow.xaml

<Window x:Class="GUDEMO.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:GUDEMO" xmlns:l="http://gu.se/Localization" WindowStartupLocation="CenterScreen"
        xmlns:properties="clr-namespace:GUDEMO.Properties" Title="AY" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <l:LanguageSelector AutogenerateLanguages="True" />
        <TextBlock Grid.Column="1" Text="{l:Static properties:Resources.AYHello}" />
    </Grid>
</Window>

注意这两个前缀

xmlns:l="http://gu.se/Localization" WindowStartupLocation="CenterScreen"

        xmlns:properties="clr-namespace:GUDEMO.Properties" 

你可以在AssemblyInfo.cs文件中添加语言标记,默认的语言

 image.png你也可以代码方式使用

image.png

你也可以

  protected override void OnStartup(StartupEventArgs e)
        {
            if (e.Args.Length == 1)
            {
                Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(e.Args[0]);
            }

            base.OnStartup(e);
        }



好了,注意,这里应该是Resources开头的,不是Resource,我前面写错了。

image.png

打开ko开头的,添加那个字典,随便给个值

image.png

image.png

效果如下:

43.gif

换成下拉形式的,先引用空间:

 xmlns:local="clr-namespace:GUDEMO" xmlns:l="http://gu.se/Localization" xmlns:localization="clr-namespace:Gu.Localization;assembly=Gu.Localization" WindowStartupLocation="CenterScreen" xmlns:globalization="clr-namespace:System.Globalization;assembly=mscorlib" xmlns:properties="clr-namespace:GUDEMO.Properties"

然后写法如下

        <StackPanel>
            <ComboBox x:Name="LanguageComboBox" MinWidth="100" HorizontalAlignment="Right" VerticalAlignment="Top" ItemsSource="{Binding Path=(localization:Translator.Cultures)}" SelectedItem="{Binding Path=(localization:Translator.Culture),
                                              Converter={x:Static l:CultureOrDefaultConverter.Default}}">
                <ComboBox.ItemTemplate>
                    <DataTemplate DataType="{x:Type globalization:CultureInfo}">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>

                            <Image Grid.Column="0" Height="12" VerticalAlignment="Center" Source="{Binding Converter={x:Static l:CultureToFlagPathConverter.Default}}" Stretch="Fill" />

                            <TextBlock Grid.Column="1" Margin="10,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding NativeName}" />
                        </Grid>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>


            <Label Content="Selected Language:" FontWeight="Bold" />
            <Label x:Name="TranslatedLabel" Content="{l:Static properties:Resources.AYHello}" />
        </StackPanel>

效果如下:

76.gif

具体保存,肯定自己把文化的简化string存到xml,下次手动赋值


你也可以直接指定哪几个语言:

<l:LanguageSelector>
    <l:Language Culture="de-DE"
                FlagSource="pack://application:,,,/Gu.Wpf.Localization;component/Flags/de.png" />
    <l:Language Culture="en-GB"
                FlagSource="pack://application:,,,/Gu.Wpf.Localization;component/Flags/gb.png" />
    <l:Language Culture="sv-SE"
                FlagSource="pack://application:,,,/Gu.Wpf.Localization;component/Flags/se.png" />
</l:LanguageSelector>





作者说可以显示 localized string

就是l:Enum方式写的,我不知道咋用的

          <TextBlock Grid.Row="4"

                     Grid.Column="1"

                     AutomationProperties.AutomationId="EnumTranslatedToAllTextBlockId"

                     Text="{l:Enum ResourceManager={x:Static p:Resources.ResourceManager},

                                   Member={x:Static local:DummyEnum.TranslatedToAll}}" />



一些附加属性


第一个

放在一个容器上,则内部有翻译错误时候,会处理

l:ErrorHandling.Mode="ReturnErrorInfo"

这个可能是翻译 没有找到值时候处理的吧,一共有4个值

image.png

官方:By setting the attached property ErrorHandling.Mode we override how translation errors are handled by the StaticExtension for the child elements. When null the StaticExtension uses ReturnErrorInfoPreserveNeutral

AY翻译:通过设置附加属性ErrorHandling.Mode,我们覆盖了子元素的StaticExtension处理转换错误的方式。 当null时,StaticExtension使用ReturnErrorInfoPreserveNeutral



第二个

image.png

用于从xaml访问Translator.CurrentCulture的markupextension。 重新绑定在CurrentCulture更改时更新的绑定。

显示文化:{Binding Path=(localization:Translator.Culture)}" 


上面忽略,我们可以增加一个类

 命名空间和当前 Resource.resx空间一样

然后,代码大致如下:作者说,分析器会去检查调用,我看不懂

namespace YourNamespace.Properties
{
    using Gu.Localization;
    using Gu.Localization.Properties;

    public static class Translate
    {
        /// <summary>Call like this: Translate.Key(nameof(Resources.Saved_file__0_)).</summary>
        /// <param name="key">A key in Properties.Resources</param>
        /// <param name="errorHandling">How to handle translation errors like missing key or culture.</param>
        /// <returns>A translation for the key.</returns>
        public static string Key(string key, ErrorHandling errorHandling = ErrorHandling.ReturnErrorInfoPreserveNeutral)
        {
            return TranslationFor(key, errorHandling).Translated;
        }

        /// <summary>Call like this: Translate.Key(nameof(Resources.Saved_file__0_)).</summary>
        /// <param name="key">A key in Properties.Resources</param>
        /// <param name="errorHandling">How to handle translation errors like missing key or culture.</param>
        /// <returns>A translation for the key.</returns>
        public static ITranslation TranslationFor(string key, ErrorHandling errorHandling = ErrorHandling.ReturnErrorInfoPreserveNeutral)
        {
            return Gu.Localization.Translation.GetOrCreate(Resources.ResourceManager, key, errorHandling);
        }
    }
}

官方一些测试例子,放在里面,如下

image.png




然后下面一些关键字的讲解,

Culture是文化,可以理解语言, 默认值是null,我们使用时候,用ContainsCulture()先检查下

CurrentCulture,我们这里很多语言,当前是那个。根据一开始提供更多网址,里面有culture的简写,会自动匹配使用dll的。

C# CultureInfo中常用的InvariantCulture,文章链接:打开

我发现一个类,作者提供的

CultureChangedEventManager

image.png

Cultures

获取可用文化的列表。 通过查看当前目录并扫描附属程序集来找到文化。你的程序不是编译后,会有一些dll的

image.png


ErrorHandling

获取或设置错误的处理方式。 默认值为Return ErrorInfo PreserveNeutral。


Translate

Translator.Culture = CultureInfo.GetCultureInfo("en"); // 不需要每次都设置的,这里只是个演示,设置一次就够了
string inEnglish = Translator.Translate(Properties.Resources.ResourceManager,
                                        nameof(Properties.Resources.AYHello));

neutral culture

一个非特定的自定义区域性。

自定义区域性可以具有以下特征:

自定义区域性可以是特定区域性或非特定区域性。 

特定区域性指定语言和区域,而非特定区域性指定语言但不指定区域。 

自定义区域性可以是替换区域性或附加区域性。


翻译未明确的语言

string neutral = Translator.Translate(Properties.Resources.AYHello,
                                      nameof(Properties.Resources.AYHello),
                                      CultureInfo.InvariantCulture);

重写全局的翻译错误处理

抛出一个一场

Translator.ErrorHandling = ErrorHandling.ReturnErrorInfo; // 不需要每次都设置的,这里只是个演示,设置一次就够了
string inSwedish = Translator.Translate(Properties.Resources.ResourceManager,
                                        nameof(Properties.Resources.AYHello),
                                        ErrorHandling.Throw);

 返回关于Error的info

Translator.ErrorHandling = ErrorHandling.Throw; // 不需要每次都设置的,这里只是个演示,设置一次就够了
string inSwedish = Translator.Translate(Properties.Resources.ResourceManager,
                                        nameof(Properties.Resources.AYHello),
                                        ErrorHandling.ReturnErrorInfo);


泛型的翻译

string  actual = Translator<Properties.Resources>.Translate(资源Key);

image.png


一些错误翻译后的显示

image.png


验证是否翻译文件是否规范

TranslationErrors errors = Validate.Translations(Properties.Resources.ResourceManager);

Assert.IsTrue(errors.IsEmpty);

在Translator.AllCultures中,所有键都具有非空值

如果资源是格式字符串,如“First:{0},second {1}”,则检查该资源。

所有文化的格式项数量都相同。

所有格式字符串都具有编号为0..1..n的格式项



EnumTranslations<T>

TranslationErrors errors = Validate.EnumTranslations<DummyEnum>(Properties.Resources.ResourceManager);

Assert.IsTrue(errors.IsEmpty);

所有枚举成员都在ResourceManager中有密钥

Translator.AllCultures中所有文化的所有键都具有非null值


验证结果

errors.ToString(" ", Environment.NewLine);

示例:

Key: EnglishOnly
  Missing for: { de, sv }
Key: Value___0_
  Has format errors, the formats are:
    Value: {0}
    null
    Värde: {0} {1}




如果你想你的程序,不想那么多语言包的dll

尝试安装Fody

image.png

接下来安装

image.png

此时客户端下,

image.png

 AYUI       www.ayjs.net      AY         杨洋原创编写,请不要转载谢谢

安装完,

显示:

image.png

接着编

译程序,AY,神奇一幕出来了,

4231.gif

再也不会有这种dll和 语言目录了。

image.png


而且,也没有任何其他的dll了,因为嵌入到一个exe里面了。Gu.Localization.dll 也没有了


 AYUI       www.ayjs.net      AY         杨洋原创编写,请不要转载谢谢



www.ayjs.net 六安杨洋(AY)拓展



验证语言包,作者推荐一个插件:https://marketplace.visualstudio.com/items?itemName=TomEnglert.ResXManager


推荐您阅读更多有关于“”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

合肥科大智能常年招聘.NET,Java,Web前端,有想找想换工作的私聊我AY唯一QQ:875556003和AY交流

抖音号:wpfui,可以看到我的很多作品效果

AYUI8社区版Github地址:前往获取

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF,目前工作繁忙,不接任何活

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费.AY主要靠卖技术服务挣钱

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表