TV盒子好用又有力的跨屏远程输入法 特威尔emoteIME

1. 前言

上壹篇小说介绍了各个WPF本地化的入门知识,那篇小说介绍UWP本地化的入门知识。

选取包下载地址:

https://github.com/kingthy/TVRemoteIME/raw/master/released/IMEService-release.apk


 

贰. 利用resw能源文件贯彻本地化

在以前的XAML平台,resx能源文件是一种很有利的本地化方案,但在UWP中微软又再一次推荐x:Uid方案,暗中认可的能源文件也变为resw能源文件。尽管后缀名只差了2个假名,但运用方法完全两样。最重点的区分是resw能源文件不会创制对应的Designer.cs类,那就造费用地化的兑现方案完全差异。

图片 1

TVRemoteIME

TV盒子的长途输入法应用,可跨屏远程输入和跨屏远程序控制制盒子

 

贰.一 在XAML中贯彻本地化

在XAML中落实本地化的历程不会细小略。首先在品种中新建”strings”文件夹,在”strings”文夹下创办”en-US”和”zh-CN”文件夹,并在三个公文夹中分头增进”Resources.resw”资源文件。最后目录结构如下:
图片 2

在zh-CN\Resources.resw和en-US\Resources.resw添加多少个新财富,分别是UsernameText博克斯.Width和UsernameTextBox.Header:
图片 3

在XAML中添加叁个TextBox,设置x:Uid为UsernameTextBox,x:Uid将XAML成分和能源文件中的能源拓展关联:

<TextBox x:Uid="UsernameTextBox"/>

运作后即可看到UsernameTextBox的Header设置为”用户名”,Width为100。

在“设置\区域和言语”旅长”English”设置为默许语言,再一次运营应用可看到运维在土耳其共和国(The Republic of Turkey)语环境下的功力。
图片 4

那般主旨的本地化功效就贯彻了。那种本地化格局有如下优点:

  • 简短便捷,不难上手
  • 语法不难,不要求Binding等文化
  • 能够钦赐任意属性举行本地化
  • 支持CLR属性

除了那一个之外,上1篇文章提到的ResXManager也支撑Resw能源文件,还是能够动用多语言应用工具包对财富文件进行保管,天涯论坛的那篇小说页对那些工具进行了详细介绍:
Win拾 UWP
开发连串:使用多语言工具包让应用支撑多语言

大概参考这一个摄像:
Windows 10 Apps Designing for Global
Customers

应用的降生

自从家里有TV盒子以来,TV观察、电影播放、娱乐小游戏什么的都以从来在盒子里启动,因为电视机显示器比起手提式有线电话机显示屏大,玩起来那效果是手机无法比的,然而在打闹的进度中也两次三番有局地困苦,比如玩游戏进程中想聊天什么的,在TV盒子里输入文字用遥控器按?只有用过才理解忧伤!外挂物理键盘,可惜很多输入法都不扶助物理键盘的同时输入,远远达不到电脑的成效!于是找了众多遥控与跨屏输入的软件,但可惜未有壹款是比较理想的,越发家里的一个微鲸Q+2代盒子,只要壹进游戏的聊天界面,不管外界设置了哪些跨屏输入法,都会自行切换为厂家自带的百度输入法,卓殊的可恶!于是就有了温馨做1款远程跨屏的输入法,于是这特威尔emoteIME就像是此诞生了…………

 

二.二 关联到别的国资本源文件

UI成分暗许与Resources.resw举办关联,假使须要和其它国资本源文件涉及,能够加上能源文件的不二诀窍。如需求与/OtherResources.resw中的资源事关,x:Uid的语法如下:

x:Uid="/OtherResources/AddressTextBox"

它能做什么样

它能扶助盒子完毕跨屏输入,未来在盒子里聊聊打字要多快就有多快;它能代表盒子遥控器,用手提式无线电电话机,电脑,IPAD摇控盒子都不是题材;它能管理盒子的选择,一键快快捷运输维/卸载应用;它能跨屏安装使用与传递文件到盒子。

 

二.三 附加属性的当地化

对系统提供的叠加属性,财富的名号语法如下:

UsernameTextBox.Grid.Row

对自定义附加属性,语法稍微复杂1些:

ShowMessageButton.[using:LocalizationDemoUwp]ButtonEx.Content

奇怪的是,就好像此直接运维应用会报错。唯有应用这一个财富的UI成分已经有那么些附加属性的值才能健康运作,简单的讲便是急需随便为那些附加属性设置三个值:

<Button Margin="5" x:Uid="ShowMessageButton"  local:ButtonEx.Content="ssssss"/>

设置格局

二.4 其它财富的当地化

除了字符串财富,别的能源的本地化格局不需求设置x:Uid,只须要树立对应语言的目录结构及命名就足以在XAML中平素引用。如项目中有如下两张图片:
图片 5

在XAML中能够一向通过Images/Flag.png引用。路径中的”zh-CN”、”en-US”称为能源限定符,用于补助两种来得比例、UI
语言、高相比较度设置等,具体可参考Load images and assets tailored for
scale, theme, high contrast, and
others

1、通过adb命令安装使用  

1、TV盒子张开adb调节和测试

2、电脑通过adb命令连接电视机盒子(要是TV盒子的内网ip为:1玖二.16八.壹.100)
adb connect 192.168.1.100:5555
小心,手提式有线电话机要与盒子在同二个WIFI互连网(内网互连网)
执行adb devices指令展现有device列表,则代表已一连上盒子,可继承下一步

3、通过以下命令安装输入法apk包
adb install IMEService-release.apk

四、设置为系统私下认可输入法
adb shell ime set com.android.tvremoteime/.IMEService  

5、电脑仍然手机访问远程输入法的决定页面 http://192.168.1.100:9978/

二.5 在代码里拜访能源

在代码中做客财富的代码如下:

var resourceLoader = ResourceLoader.GetForCurrentView();
var currentLanguage = resourceLoader.GetString("CurrentLanguage");
resourceLoader = ResourceLoader.GetForCurrentView("OtherResources");
var message = resourceLoader.GetString("Message");

地方的代码中,currentLanguage从私下认可的财富文件Resources.resw中获得,resourceLoader
无需内定能源文件的称谓;而message
则从OtherResources.resw获取,resourceLoader 供给内定财富文件的名称。

如须求运用别的类库中的能源,代码如下:

resourceLoader = ResourceLoader.GetForCurrentView("LocalizationDemoUwp.ResourceLibrary/Resources");
currentLanguage = resourceLoader.GetString("CurrentLanguage");

就算语法简单,但足以看来最大的标题是财富的名目没有智能感知和谬误提醒,那样使用能源很不难出错。

图片 6

如上海体育地方所示,对错误的财富名称,ReSharper会有错误提醒,可是那种结构ResourceLoader的法子已经被标记为Deprecated并提醒使用GetForCurrentView获取ResourceLoader,而选拔GetForCurrentView的处境下ReSharper又没错误提醒。不清楚Re夏普er曾几何时才能支撑在GetForCurrentView的主意下显得错误提醒(笔者设置的Re夏普er已是最新的2017.二)。

2、通过U盘大概其余方法安装  

1、安装后在盒子应用列表里找到特威尔emoteIME的图标点击运维

2、依据使用的提示实行设置即可。

2.6 存在的题材

其1本地化方案即使简易,但自笔者觉得很难使用,因为这一个方案存在不少标题。

第叁是统一筹划时帮忙,对本地化来说,设计时援救重点包罗三片段:

  • 在编写XAML时方可收获财富的智能感知
  • 有整机的规划视图
  • 在不相同语言之间切换

率先点,没有,而且写错属性名称还不会在编译时报错,而是用最严寒的诀要彰显:运营时崩溃。

第三点,在Fall Creators Update
(16299)此前,没有,设计视图一片空白。也得以随便写一些内容(如TextBox x:Uid="UsernameTextBox" Header="(here is header)")以协理设计。但在XAML中写的任何内容都或者被财富文件覆盖,无论是公事依然大小、对齐格局或其它具有属性对XAML的编者来说都以不可控的,不到骨子里运转时一直不清楚UI的末段效果,这就很考验本地化职员和测试职员。在Fall
Creators
Update以往终于能够在统一筹划视图看到本地化的效用,那只好说是巨大的升华。

其三点,方今来看做不到。

除此以外,能源管理也是个很费力的题材。同一个字符串,即使要对应TextBlock.Text、ContentControl.Content、TextBox.Header,这样就须求两个能源,造成了冗余,而恢宏的冗余最终会促成错误。

如上所述,这么些本地化方案有成都百货上千标题,即使那么些方案是微软引荐的。既然是微软援引的,应该是协助最棒的,可能是自小编的用法不对?

接下去在那个方案的根基上做些改动,希望得以让本地化更好用。

控制界面示例截图(输入控制端不必要设置任何APK应用,直接浏览器操作)

图片 7

三. 动态切换语言

不是笔者太执着动态切换语言,是测试员真的喜欢那么些效果,因为不用重启应用就能够测试到独具语言的UI。

UWP提供了ApplicationLanguages.PrimaryLanguageOverride属性用于转移语言首要选拔项,即能够变动使用的言语,用法如下:

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "zh-CN";

那几个变更是永久的,但不会对眼下UI及片段种类组件生效,只会潜移默化以往创制的UI成分。更改ApplicationLanguages.PrimaryLanguageOverride,会异步地接触ResourceContext.QualifierValues的MapChanged事件,能够监听这么些事件并更新UI。那样就足以兑现简单的动态切换语言功效。

DynamicResources.cs

public class DynamicResources : INotifyPropertyChanged
{
    public DynamicResources()
    {
        _defaultContextForCurrentView = ResourceContext.GetForCurrentView();

        _defaultContextForCurrentView.QualifierValues.MapChanged += async (s, m) =>
        {
            await MainPage.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                OnPropertyChanged("");
            });
        };
    }

    private ResourceContext _defaultContextForCurrentView;

    public string Main
    {
        get { return ResourceManager.Current.MainResourceMap.GetValue("DynamicResources/Main", _defaultContextForCurrentView).ValueAsString; }
    }

    public string Settings
    {

        get { return ResourceManager.Current.MainResourceMap.GetValue("DynamicResources/Settings", _defaultContextForCurrentView).ValueAsString; }
    }

    public string RestartNote
    {
        get { return ResourceManager.Current.MainResourceMap.GetValue("DynamicResources/RestartNote", _defaultContextForCurrentView).ValueAsString; }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

SettingView.xaml

<Page.Resources>
    <local:DynamicResources x:Key="DynamicResources"/>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel>
        <ListView x:Name="LanguageListView" Margin="10">
            <ListViewItem Tag="zh-Hans-CN" Content="中文"/>
            <ListViewItem Tag="en-US" Content="English"/>
        </ListView>
        <TextBlock x:Name="NoteElement" Foreground="#FFF99F00" Margin="20,10" Visibility="Collapsed"
                   Text="{Binding RestartNote,Source={StaticResource DynamicResources}}"
                   />
    </StackPanel>
</Grid>

SettingView.xaml.cs

private async void OnLanguageListViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var item = LanguageListView.SelectedItem as ListViewItem;
    if (item == null)
        return;

    ApplicationLanguages.PrimaryLanguageOverride = item.Tag as string;
    _hasChangedLanguage = true;
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, ShowNoteElement);
}

private void ShowNoteElement()
{
    NoteElement.Visibility = Visibility.Visible;
    var appView = Windows.UI.ViewManagement.ApplicationView.GetForCurrentView();
    appView.Title = (LanguageListView.SelectedItem as ListViewItem)?.Content as string;
}

图片 8

只在装置页面及菜单那么些在切换语言时不会重新加载的UI上采用Binding,其余地点不变,那样回顾的动态切换语言就落实了。运营结果如上,能够见到TextBox右键菜单仍未切换语言,要求再行启航。

UWP暗中认可只安装总括机对应的语言,那样能够节约安装空间,但潜移默化到动态切换语言的作用,要化解那一个题材能够参见以下内容(作者并未有证实过):[localization

引用第3方包表达

1、NanoHttpd  用于落到实处HTTP
WEB服务

2、ZXing 用于贯彻2维码的出口

 

四. 收获完全的设计视图

在Fall Creators
Update从前为了取得设计时视图能够应用索引器。很少有机会在C#中用到索引器,XAML中也很少用到Binding到字符串索引的语法,正是那四个职能在本地化中帮了大忙。

public class ResourcesStrings
{
    public string this[string key]
    {
        get
        {
            return ResourceLoader.GetForViewIndependentUse().GetString(key);
        }
    }
}

<Page.Resources>
    <local:ResourcesStrings x:Key="S"/>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock Text="{Binding Source={StaticResource S},Path=[MainTitle]}" />
</Grid>

图片 9

只要求这么写就能够得到完整的统筹时试图,可是照旧尚未缓解智能感知和错误提醒那五个难题。

在这么些方案上也可总结地促成动态切换语言。

public class ApplicationResources : INotifyPropertyChanged
{
    public ApplicationResources()
    {
        DynamicResources = new DynamicResourcesStrings();
        Resources = new ResourcesStrings();
        Current = this;
    }

    public static ApplicationResources Current { get; private set; }

    public event PropertyChangedEventHandler PropertyChanged;

    public DynamicResourcesStrings DynamicResources { get; }

    public ResourcesStrings Resources { get; }

    public string Language
    {
        get
        {
            return ApplicationLanguages.PrimaryLanguageOverride;
        }
        set
        {

            if (ApplicationLanguages.PrimaryLanguageOverride == value)
                return;

            ApplicationLanguages.PrimaryLanguageOverride = value;
            if (MainPage.Current != null )
                MainPage.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { OnPropertyChanged(""); });
        }
    }

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

<ListViewItem Content="{Binding Source={StaticResource R},Path=DynamicResources[Main]}"/>

不精晓为什么,在VisualStudio上偶尔不能获得设计时视图,全部文字都显示为”Item”。

提示:近期项目权且不开源,发求源代码之类的新闻都不会还原,前期依据事态再决定是不是开源,对些请各位谅解!

5. 运用resx财富文件

既然UWP是XAML咱们族的壹份子,那么应该也能够应用resx能源文件落到实处本地化,毕竟生成resx对应代码的是PublicResXFileCodeGenerator,而不是UWP自己。

  1. 打开“添加新项”对话框,选中“资源文件(.resw)”,在“名称”文本框中将文件名称改为“Labels.resx”,点击“添加”。
  2. 在“化解方案能源管理器”选中“Labels.resx”,邮件打开“属性”视图,“生成操作”采取“嵌入的能源”。
  3. 将“Labels.resx”复制为“Labels.zh-CN.resx”,打开“Labels.zh-CN.resx”,“访问修饰符”改为“无代码生成”。
  4. 在“AssemblyInfo.cs”添加如下代码:

    [assembly: NeutralResourcesLanguage("en-US")]
    

这么就能够在UWP中使用resx财富文件了。实现本地化的代码和上一篇小说中牵线的WPF本地化方案大约。

public class ApplicationResources : INotifyPropertyChanged
{
    public static ApplicationResources Current { get; private set; }

    public ApplicationResources()
    {
        Labels = new Labels();
        if (string.IsNullOrWhiteSpace(ApplicationLanguages.PrimaryLanguageOverride) == false)
            Language = ApplicationLanguages.PrimaryLanguageOverride;
        else
            Language = Windows.System.UserProfile.GlobalizationPreferences.Languages.FirstOrDefault();

        Current = this;
    }

    public Labels Labels { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    }

    private string _language;

    /// <summary>
    /// 获取或设置 Language 的值
    /// </summary>
    public string Language
    {
        get { return _language; }
        set
        {
            if (_language == value)
                return;

            _language = value;
            Labels.Culture = new System.Globalization.CultureInfo(_language);
            ApplicationLanguages.PrimaryLanguageOverride = _language;
            OnPropertyChanged("");
        }
    }
}

使用体验和WPF中的resx本地化方案差不离,设计时帮助差不多完美,包罗智能感知和错误提醒,可是照旧无法化解系统组件中的本地化难点(如TextBox右键菜单)。此外,编写翻译时会报错:带有输出类型“appcontainerexe”的系列不扶助生成操作“EmbeddedResource”。消除方案是不在UWP应用类型中添加resx财富文件,而在类库中添加resx财富文件,那样连错误都不报了。

不明了Xamarin.Forms是否也足以如此落成,究竟它也是XAML大家族的1员。

6. 结语

钻探了如此多resw财富文件的方案,结果要么resx财富文件用得最顺手,毕竟这一个方案笔者曾经用了好多年(在silverlight中不得不用那些方案)。具体采纳哪个方案不一致。

亟需强调的是resx并不能够完全代替resw方案,很多时候要求混合使用,例如利用的Display
Name能够选择resw轻松完毕本地化:
图片 10

本地化的宗旨仍有为数不少内容,那篇小说只打算介绍入门知识,更透彻的学问能够参照下边给出的链接。

7. 参考

Guidelines for globalization – UWP app developer Microsoft
Docs

Localize strings in your UI and app package manifest – UWP app
developer Microsoft
Docs

Load images and assets tailored for scale, theme, high contrast, and
others – UWP app developer Microsoft
Docs

神速入门:翻译 UI 资源(XAML)
c# – UWP Resource file for languages is not deployed correctly – Stack
Overflow

localization – How to always install all localized resources in Windows
Store UWP app – Stack
Overflow

Win十 UWP 开发种类:使用多语言工具包让应用支撑多语言 – yan_xiaodi –
博客园

Windows 10 Apps Designing for Global
Customers

8. 源码

GitHub –
LocalizationDemo

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注