[UWP]本地化入门

竞技竞品分析(Competitive
Analysis)一词太早来教育学领域。市场营销和战略性管理方面的竞品分析是据对现有的要么地下的竞争产品的优势和劣势举办评价。现在深受广泛应用于互联网产品之立项筹备等,通过竞高效的竞品分析,可以给成品团队对自家产品的要求把握、对市场态势发生进一步清楚的体会,知其知己。

1. 前言

及同首随笔介绍了各种WPF本地化的入门知识,这篇稿子介绍UWP本地化的入门知识。

无异于卖出色(有)秀(用)的竞品分析报告,不是说简练地找几独八九不离十的制品,罗列几个效益,说多少个优缺点就可以的,其中频繁包括了森文案撰写逻辑,相比较分析方法论,还有无限要害的凡作者说了同一可怜属分析未来的题目迎刃而解思路。

2. 行使resw资源文件落实本地化

于往日的XAML平台,resx资源文件是相同种植异常有利之本地化方案,但以UWP中微软以复推荐x:Uid方案,默认的资源文件呢变为resw资源文件。即使后缀名只差了一个字母,但用办法完全两样。最根本的界别是resw资源文件不会见成立对应的Designer.cs类,这就是造成本地化的落实方案了不同。

图片 1

这对创作竞品分析的架子应该系如何的为?

2.1 在XAML中贯彻本地化

以XAML中贯彻本地化的长河很粗略。首先以档次受到新构筑”strings”文件夹,在”strings”文夹下创办”en-US”和”zh-CN”文件夹,并在简单单文件夹着分别长”Resources.resw”资源文件。最后目录结构如下:
图片 2

在zh-CN\Resources.resw和en-US\Resources.resw添加少单新资源,分别是UsernameTextBox.Width和UsernameTextBox.Header:
图片 3

每当XAML中上加一个TextBox,设置x:Uid为UsernameTextBox,x:Uid将XAML元素和资源文件中之资源拓展关联:

<TextBox x:Uid="UsernameTextBox"/>

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

在“设置\区域和语言”司令员”English”设置也默认语言,再度运行应用可看出运行在印度语印尼语环境下的功用。
图片 4

诸如此类中央的本地化效率就兑现了。这种本地化形式来如下优点:

  • 简简单单连忙,容易达成亲手
  • 语法简单,不需Binding等学问
  • 足指定任意属性举行本地化
  • 支持CLR属性

除去,上同一首著作提到的ResXManager也支撑Resw资源文件,还好选用多语言使用工具确保对资源文件举行管理,和讯的当即篇稿子页对这家伙举行了详细介绍:
Win10 UWP
开发系列:使用多语言工具包让应用支撑多语言

要参考这视频:
Windows 10 Apps Designing for Global
Customers

竞品分析三步曲

2.2 关联到任何资源文件

UI元素默认与Resources.resw举办关联,固然欲与其余资源文件涉及,可以加上资源文件的路线。如得与/OtherResources.resw中之资源事关,x:Uid的语法如下:

x:Uid="/OtherResources/AddressTextBox"

采用分析目的:明确竞品分析的根本和需要解决之题目;拔取适当的竞品(业务相同或者连带的出品)

2.3 附加属性的本地化

本着网提供的附加属性,资源的名称语法如下:

UsernameTextBox.Grid.Row

本着由定义附加属性,语法稍微复杂一些:

ShowMessageButton.[using:LocalizationDemoUwp]ButtonEx.Content

奇怪的是,就这样直接运行应用会报错。唯有利用之资源的UI元素已经来这附加属性的值才可以健康运转,简而言之尽管是要随便为者附加属性设置一个值:

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

相比较之下和分析:遵照若干维度(产品效用、交互设计、运营策略等)对成品与竞品进行逐一罗列相比较与剖析优劣

2.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

研讨与提议解决思路:按照第一步之建的分析首要和亚步相关维度的自查自纠举办归结探讨分析,进一步可做当前的行发展趋势,提议可逻辑的缓解方案思路。

2.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的情下Re夏普(Sharp)er又尚未不当提醒。不亮Re夏普(Sharp)er何时才会支撑于GetForCurrentView的计下显得错误指示(我设置之Re夏普er已是风靡的2017.2)。

1

2.6 存在的问题

是本地化方案虽简单,但自以为特别为难使,因为这些方案在多题材。

第一是计划时帮助,对本地化来说,设计时协助至关首要含有3部分:

  • 以编写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,这样便需要三私营源,造成了冗余,而大气之冗余最后会招错误。

看来,那些本地化方案来成千上万问题,即便那一个方案是微软引荐的。既然是微软援引的,应该是永葆太好的,也许是自身之用法不对?

搭下当此方案的基础及开来改动,希望得以叫本地化更好用。

设定分析目的

3. 动态切换语言

无是自身最好执着动态切换语言,是测试员真的好是职能,因为不用再行开应用即足以测试到所有语言的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;
}

图片 7

单纯于装页面和菜单这个当切换语言时未会合再次加载的UI上采纳Binding,此外地点不更换,这样简单的动态切换语言就兑现了。运行结果要达到,可以见到TextBox右键菜单随不切换语言,需要重新开动。

UWP默认只安装总结机对应之言语,这样好省去安装空间,但影响及动态切换语言的效能,要解决是题材可以参照以下内容(我从不表明了):[localization

群新人以及童鞋(包括已的卤煮)在首先破写竞品分析的下,往往还会面过度讲究直接去比分析,而忽略了怎么样筛选竞品,为啥做竞品分析,分析的重点是啊,需要缓解什么问题非凡细节。

4. 赢得完整的统筹视图

于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>

图片 8

徒待这么描绘就足以取完整的规划时拟,不过要无解决智能感知和不当指示这一点儿只问题。

于这方案达成啊可粗略地实现动态切换语言。

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大家族的如出一辙各种。

若在那里自己引申为“选用分析目的”。那里带有两接近对象:

6. 结语

琢磨了这么多resw资源文件之方案,结果要么resx资源文件用得最为顺手,毕竟这方案我曾为此了成百上千年(在silverlight中只可以用此方案)。具体选用什么人方案不同。

需要强调的凡resx并无可以全代表resw方案,很多时光要混合使用,例如使用的Display
Name可以利用resw轻松实现本地化:
图片 9

本地化的要旨仍时有暴发无数内容,这首随笔就打算介绍入门知识,更深切之学识可以参考下边被来底链接。

浅析的关键性:任何一样卖报告还有一个基本点,竞品分析一般也会围绕一个着力(集团的提升趋势、产品之迭代方向等)去开展,那个中心就是分析议论的本位,需要作者花还多篇幅去开详细讲演,否则面面俱到特会晤叫好陷在元气崩溃、读者读乏味的泥沼中。

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

Win10 UWP 开发系列:使用多语言工具包让应用支撑多语言 – yan_xiaodi –
博客园

Windows 10 Apps Designing for Global
Customers

栗子:卤煮在此以前写过相同首社交产品的竞品分析,目标是寻觅一种植更nice的构建陌生人关系的主意及哪些帮扶陌生人打交道平台沉淀用户关系链。至于社交平台咋样流量变现、运营策略那多少个就非是大旨,简单相比较即可,少花精力分析。

8. 源码

GitHub –
LocalizationDemo

挑选竞品:选对了竞品事半功倍,选错了悔恨终身。竞品分析的唯一前提就是是竞品,倘若你竞品都采取错了,浪费工作量不说,得出错误结论祸害团队这才是沉重之。

栗子:仍然卤煮那篇文档,当初同一想到移动社交,就记忆微信,即使为认为不妥,但是加进去写了。尽管最后为一直不最多篇幅关于其,最多就是是荒废工作量。不过只要卤煮脑袋金立热得出了只结论说“陌生人的管用格局是摇一摇和漂流瓶,因为微信体量很死,所以提出走社交产品必须加以这俩效应”,这怎么不是被长辈笑惨了(逗你的

  • -)。

那么什么正确采用竞品呢,所谓知己知彼。首先是要相亲:

设是立项阶段,就设明时市场趋势在乌,用户需,产品定位等。

使是周边迭代改版,可能会面众口一辞本来产品之不足之处以及后来产品之风味等。

这里介绍刘津前辈的一个选竞品的迅速方法,如下图。该办法相相比较严俊和错综复杂,实际接纳还要扣报告的急需来活采用。

图片 10

2

比较之下与剖析

对照和剖析是竞品分析的内容重点,一般生有限单点要着重注意:

浅析维度

竞品分析,可能相会起以下几独维度举办自查自纠分析:战略定位、盈利情势、用户群体、产品功用、产品界面(交互格局、视觉突显)、数据与技能等,对于不同目标的竞品分析,会有着侧重,这跟第一步着规定分析目的相呼应。

只要正重UE角度分析,可以参照《The Elements of User
Experience》的有关理论(将UE分为5只规模),实际写报告上,将相应内容填充即可。

图片 11

解析准则

甭管召开何人维度的对照,都急需依照相同的业内(准则),才可以作出客观之辨析。不过当下对一般的制品效能来说,没有成文的正经,大概就“相同之操作系统,同一时期的版本,同一地点的本子等”即可。而召开交互分析,可能用严厉依照类似“十起可用性准则”之类的规律来举办:1,一致性和标准性;2,通过中的反映信息提供强烈的系状态;3,方便快速的下;4,预防出错;5,援救用户认识,分析以及改革错误;6,识别而未是想起;7,符合用户之实世界;8,用户擅自控制权;9,美观,精简的规划;10,协助及认证。

相对而言分析一般步骤是:

–>寻找产品元素

–>罗列展现(截图、标示、图表法等)

–>列举各自优缺点(尽可能考虑有更特别层次的逻辑关系,揣摩竞争对手的效能)

参考的眼前试官的上报和顺序网路大神的博文归结可知,这同样片要不在于你罗列多详细,而在于你拿每个罗列项分析到位了并未(好像是废话啊,orz)

3

议论与提出解决思路

暴发矣达标等同步坚实的剖析基础,最后一步就是是亮自己败(吹)决(水)问(功)题(力)了。

回头看看好定下的竞品分析目的是啊,需要吗解决什么问题

看望第二步着相应维度的对照分析结论,然后切换至用户地方,脑补一下温馨的“需求”是呀

最后咋一首科技媒体之“趋势分析”,理解近未来底行趋势

虽然得脑洞大开出属于自己之缓解方案了

方即便说话略带戏,但骨子里情况大体就是这般,尤其是新娘和学生在行业知识无死丰的时节,借鉴专业媒体来开辟思路不失为一个主意,可是最好好与否该重新多地基于自己亲自体会的感受,即使您的是“伪需求”,但总为表示在某平像样用户。

补相同长:

挂念给祥和之缓解方案看起更加靠谱,几度用引用一些切实的多寡来定性分析,这时能够整合自己状况做来稍调研,理解一下别用户对拖欠问题之观,或者去有数码门户(http://www.iresearch.cn/等),看看专业调查分析的一些借鉴一下。

双重上相同条:

只的竞品分析没有啊意思,切勿为了分析倘使分析,而是应带在问题去举办竞品分析,把竞品分析作为是熟识业务、解决问题的招数。

如上是有关卤煮在此之前皆以描写竞品分析下发过的一对谬误的检查与方法论的下结论,还有对有的网络大神出色作品的援。

最后谢谢:

天涯论坛用户体验设计大旨:

http://uedc.163.com/

不有名大神的博客:

http://www.cnblogs.com/frankfang/archive/2011/04/21/2023618.html

末尾提供一个小学生水平的应酬竞品分析模版,给我们看做反面教材  🙂

http://share.weiyun.com/e166639c2c53b43b47b16823b5bacee3

爱屋及乌我毛事

点击屏幕右上较量查看公众号如故复制:guanwomaoshi

好关注自我,查看更多有意思的章

原创·分享·关注而所想

IT圈内人口,积极发展,偶尔说说产品、聊聊电商、谈谈游戏,我是一个怪严穆的总人口!