当前位置: 首页 > news >正文

[Silverlight]通过MVVM模式实现本地化/全球化(1)

关于Silverlight本地化的文章已然不少。在园子里nasa的Silverlight本地化正是一篇好文。而本文将从其他角度解析这方面的知识,本文将包括如下几个方面的内容

  • 本地化/全球化的意义
  • 在Silverlight中使用.resx实现本地化/全球化的几种方式
  • 在Silverlight中通过MVVM实现本地化/全球化
  • 示例及源码

本地化/全球化的意义

本地化/全球化是当我们的应用/产品发展到一定阶段的时候必然会遇到的问题,我认为不要因为“我们的客户全是国内公司”这种想法而在产品初期不考虑本地化/全球化的问题。其原因在于:

1 我们永远无法预知以后的事情。

2 国内公司的概念有两种,一种是本土公司一种是跨国公司。跨国公司自不必说,即使在本土公司中使用的项目也难免出现“老外来视察”这类情况。

3 在开发前期考虑本地化/全球化问题远比在维护阶段做这些工作容易得到。看之前的项目代码(尤其还可能不是自己写的)、改代码可是程序员最讨厌的事情之一,如果再碰到组织混乱的代码,那简直就是噩梦了。

4 .NET中提供的本地化/全球化方案简单方便强大,成本增加有限。

综上所述,除非是小型项目(如小型企业网站项目等),我建议在产品初级就需考虑本地化/全球化的问题。

在Silverlight中实现本地化/全球化的方式

Silverlight的Framework是.NET Framework的子集,对本地化/全球化的支持也很完整。与普遍的.NET应用程序相同,都是使用.resx文件做为本地化资源文件实现。(当然,使用其他的一些本地化/全球化方案也可以,如硬编码设置常量等,本文主要讲述使用资源文件的方法)

这里以MS的Project2007为例说明一个使用resx的经典场景:

image image 在这两处均出现“新建”字样。如果我们要将其改为繁体版或英文版,那么按照传统的方式就必须打开Visual Studio分别修改这两处的文字,牵一发而动全身。(某些行业软件中相同的词条更是成千上万)

而使用.resx文件后我们只需修改相应语言的对应词条即可。

从这一层面来说,使用.resx还遵循了DRY原则。

注:在Silverlight中由于Resource一词有特殊含义,所以本文中皆使用.resx代表本地化资源文件。

在Silverlight中使用.resx实现本地化/全球化的方式

常言道:“只选对的不选贵的”。这句话也可以理解为最适合的才是最好的。在Silverlight中,有很多种方法可以通过使用.resx实现本地化/全球化。没有哪一种办法是最好的,这要根据你的喜好和项目本身的情况(如周边资源、项目组平均能力)等进行选择。

这里我列举出一些解决方案,他们都各有利弊:

  • 方法1:Business Application

安装.NET WCF RIA Services后就可以在新建Silverlight项目的窗口中找到该模板。通过该模板创建的项目会自动在Helpers文件夹下创建一个ResourceWrapper类来包装所有的.resx类的实例。

其优点是:代码都是由模板自动创建的,省了很多功夫。

  • 方法2:后台硬编码

很传统的方法,比如后台可以写

public string ResourceLabelDate { 
    get { 
        return MyStrings.Label_Date;
    } 
}

前台可以写

<TextBlock x:Name="lblDate"/>

其优点是:code的时候支持代码感知,强类型,前台Xaml干净整洁

  • 方法3:今天的主角—MVVM

后台一样是

public string ResourceLabelDate { 
    get { 
        return MyStrings.Label_Date;
    } 
}

前台

<TextBlock Text="{Binding ResourceLabelDate}"/>

其优点是:MVVM模式与生俱来的优势;对ViewModel进行单元测试很方便;前台Xaml也很干净。

另外还有Telerik公司出品的LocalizationManager等方式,这里就不一一列举了。

 

 

在下一篇文章中,我们将从零开始一步步的通过MVVM模式实现本地化/全球化并提供源码。













本文转自紫色永恒51CTO博客,原文链接: http://www.cnblogs.com/024hi/archive/2010/03/18/1689369.html,如需转载请自行联系原作者

相关文章:

  • XenApp_XenDesktop_7.6实战篇之十七:XenApp应用程序交付
  • 特殊权限(t)之粘着位
  • Android图片采样缩放
  • dig一些常用例子
  • 【52ABP实战教程】0.1-- Devops如何用VSTS持续集成到Github仓库!
  • nginx 另一WAF方式
  • 修改Linux的22端口几种方法
  • 再谈谈火车票系统
  • 模式--创建型
  • Just for fun——迅速写完快速排序
  • 十六进制之间的转换(二进制、八进制、十六进制、十进制)
  • php7.1.1一键安装/配置文件简单优化
  • Office 365中管理员角色介绍-进阶篇
  • SQL Server-表表达式基础
  • Oracle 11g RAC 故障之--Instance 启动失败
  • “大数据应用场景”之隔壁老王(连载四)
  • 10个确保微服务与容器安全的最佳实践
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Angular 2 DI - IoC DI - 1
  • flask接收请求并推入栈
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript 一些 DOM 的知识点
  • maven工程打包jar以及java jar命令的classpath使用
  • nodejs:开发并发布一个nodejs包
  • PAT A1092
  • Python 基础起步 (十) 什么叫函数?
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Vim 折腾记
  • 电商搜索引擎的架构设计和性能优化
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 嵌入式文件系统
  • 区块链技术特点之去中心化特性
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 2017年360最后一道编程题
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • (LeetCode 49)Anagrams
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (搬运以学习)flask 上下文的实现
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .NET CORE Aws S3 使用
  • .net mvc 获取url中controller和action
  • .net2005怎么读string形的xml,不是xml文件。
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • :not(:first-child)和:not(:last-child)的用法
  • @GetMapping和@RequestMapping的区别
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [BeginCTF]真龙之力
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [DM复习]关联规则挖掘(下)