iOS app 名字的多国语言本地化

好多人知道iOS app 程序里面的语言怎么本地化,但是对app名字的本地化好像还不是很清楚,

其实app 名字的多国语言本地化也很简单

每次我们新建一个project的时候都有一个文件是InfoPlist.strings这个文件,我们就在这个里面加我们的多国语言就好了

例如:

 

这样具体的里面设置为:

英语的就是

  1. “CFBundleDisplayName” = “test”;

中文:

 

 

 

  1. “CFBundleDisplayName” = “测试”;

 

西班牙:

 

  1. “CFBundleDisplayName” = “Me Gusta”;

 

日语:

 

  1. “CFBundleDisplayName” = “テスト”;

这样就ok了。

 

效果:

英语:

日语:

西班牙:

 

中文:

淘宝的网页贵在哪里?

  • 你发现快要过年了,于是想给你的女朋友买一件毛衣,你打开了http://www.taobao.com。这时你的浏览器首先查询DNS服务器,将http://www.taobao.com转换成ip地址。不过首先你会发现,你在不同的地区或者不同的网络(电信、联通、移动)的情况下,转换后的IP地址很可能是 不一样的,这首先涉及到负载均衡的第一步,通过DNS解析域名时将你的访问分配到不同的入口,同时尽可能保证你所访问的入口是所有入口中可能较快的一个 (这和后文的CDN不一样)。
  • 你通过这个入口成功的访问了http://www.taobao.com的实际的入口IP地址。这时你产生了一个PV,即Page View,页面访问。每日每个网站的总PV量是形容一个网站规模的重要指标。淘宝网全网在平日(非促销期间)的PV大概是16-25亿之间。同时作为一个独立的用户,你这次访问淘宝网的所有页面,均算作一个UV(Unique Visitor用户访问)。最近臭名昭著的http://12306.cn的日PV量最高峰在10亿左右,而UV量却远小于淘宝网十余倍,这其中的原因我相信大家都会知道。
  • 因为同一时刻访问http://www.taobao.com的人数过于巨大,所以即便是生成淘宝首页页面的服务器,也不可能仅有一台。仅用于生成http://www.taobao.com首页的服务器就可能有成百上千台,那么你的一次访问时生成页面给你看的任务便会被分配给其中一台服务器完成。这个过程要保证公正、公平、平均(暨这成百上千台服务器每台负担的用户数要差不多),这一很复杂的过程是由几个系统配合完成,其中最关键的便是LVS(Linux Virtual Server),世界上最流行的负载均衡系统之一,正是由目前在淘宝网供职的章文嵩博士开发的。
  • 经过一系列复杂的逻辑运算和数据处理,用于这次给你看的淘宝网首页的HTML内容便生成成功了。对web前端稍微有点常识的童鞋都应该知道,下一步浏览器会去加载页面中用到的css、js、图片、脚本和资源文件。但是可能相对较少的同学才会知道,你的浏览器在同一个域名下并发加载的资源数量是有限制的,例如IE6-7是两个,IE8是6个,Chrome各版本不大一样,一般是4-6个。我刚刚看了一下,我访问淘宝网首页需要加载126个资源,那么如此小的并发连接数自然会加载很久。所以前端开发人员往往会将上述这些资源文件分布在好多个域名下,变相的绕过浏览器的这个限制,同时也为下文的CDN工作做准备。
  • 据不可靠消息,在双十一当天高峰,淘宝的访问流量最巅峰达到871GB/S。这个数字意味着需要178万个4Mb带宽的家庭宽带才能负担的起,也完全有能力拖垮一个中小城市的全部互联网带宽。那么显然,这些访问流量不可能集中在一起。并且大家都知道,不同地区不同网络(电信、联通等)之间互访会非常缓慢,但是你却发现很少发现淘宝网访问缓慢。这便是CDN(Content Delivery Network),即内容分发网络的作用。淘宝在全国各地建立了数十上百个CDN节点,利用一些手段保证你访问的(这里主要指js、css、图片等)地方是离你最近的CDN节点,这样便保证了大流量分散在各地访问的加速节点上。
  • 这便出现了一个问题,那就是假若一个卖家发布了一个新的宝贝,上传了几张新的宝贝图片,那么淘宝网如何保证全国各地的CDN节点中都会同步的存在这几张图 片供用户使用呢?这里边就涉及到了大量的内容分发与同步的相关技术。淘宝开发了分布式文件系统TFS(Taobao File System)来处理这类问题。
  • 好了,这时你终于加载完了淘宝首页,那么你习惯性的在首页搜索框中输入了’毛衣’二字并敲回车,这时你又产生了一个PV,然后,淘宝网的主搜索系统便开始为你服务了。它首先对你输入的内容基于一个分词库进行分词操作。众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果是:我 是 一个 学生。
  • 进行分词之后,还需要根据你输入的搜索词进行你的购物意图分析。用户进行搜索时常常有如下几类意图:(1)浏览型:没有明确的购物对象和意图,边看边买,用户比较随意和感性。Query例如:”2010年10大香水排行”,”2010年流行毛衣”, “zippo有多少种类?”;(2)查询型:有一定的购物意图,体现在对属性的要求上。Query例如:”适合老人用的手机”,”500元 手表”;(3)对比型:已经缩小了购物意图,具体到了某几个产品。Query例如:”诺基亚E71 E63″,”akg k450 px200″;(4)确定型:已经做了基本决定,重点考察某个对象。Query例如:”诺基亚N97″,”IBM T60″。通过对你的购物意图的分析,主搜索会呈现出完全不同的结果来。
  • 之后的数个步骤后,主搜索系统便根据上述以及更多复杂的条件列出了搜索结果,这一切是由一千多台搜索服务器完成。然后你开始逐一点击浏览搜索出的宝贝。你开始查看宝贝详情页面。经常网购的亲们会发现,当你买过了一个宝贝之后,即便是商家多次修改了宝贝详情页,你仍然能够通过‘已买到的宝贝’查看当时的快照。这是为了防止商家对在商品详情中承诺过的东西赖账不认。那么显然,对于每年数十上百亿比交易的商品详情快照进行保存和快速调用不是一个简单的事情。这 其中又涉及到数套系统的共同协作,其中较为重要的是Tair,淘宝自行研发的分布式KV存储方案。
  • 然后无论你是否真正进行了交易,你的这些访问行为便忠实的被系统记录下来,用于后续的业务逻辑和数据分析。这些记录中访问日志记录便是最重要的记录之一, 但是前边我们得知,这些访问是分布在各个地区很多不同的服务器上的,并且由于用户众多,这些日志记录都非常庞大,达到TB级别非常正常。那么为了快速及时 传输同步这些日志数据,淘宝研发了TimeTunnel,用于进行实时的数据传输,交给后端系统进行计算报表等操作。
  • 你的浏览数据、交易数据以及其它很多很多的数据记录均会被保留下来。使得淘宝存储的历史数据轻而易举的便达到了十数甚至更多个 PB(1PB=1024TB=1048576GB)。如此巨大的数据量经过淘宝系统1:120的极限压缩存储在淘宝的数据仓库中。并且通过一个叫做云梯的,由2000多台服务器组成的超大规模数据系统不断的进行分析和挖掘。
  • 从这些数据中淘宝能够知道小到你是谁,你喜欢什么,你的孩子几岁了,你是否在谈恋爱,喜欢玩魔兽世界的人喜欢什么样的饮料等,大到各行各业的零售情况、各类商品的兴衰消亡等等海量的信息。
  • 说了这么多,其实也只是叙述了淘宝上正在运行的成千上万个系统中的寥寥几个。即便是你仅仅访问一次淘宝的首页,所涉及到的技术和系统规模都是你完全无法想 象的,是淘宝2000多名顶级的工程师们的心血结晶,其中甚至包括长江学者、国家科学技术最高奖得主等众多大牛。同样,百度、腾讯等的业务系统也绝不比淘宝简单。你需要知道的是,你每天使用的互联网产品,看似简单易用,背后却凝聚着难以想象的智慧与劳动。

javascript的this,与闭包案例分析?

先请看如下两端代码:
代码片段一:
var name = “The Window”;
var object = {
name : “My Object”,
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
代码片段二:
var name = “The Window”;
var object = {
name : “My Object”,
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());
答案分别是:The window 和 My Object。
这是我在开始学习JQ的时候看到介绍了闭包,然后网上看得例子。

疑问1:这两个有没有形成闭包?要产生闭包效果的环境必须是嵌套函数的引用被保存到了一个全局作用域里么?在这两段代码中是否体现这一点。

疑问2:在原帖中有人留言说造成答案不同的原因在于this而与闭包无关系。我再chrome的控制台下,分别在getNameFunc : function(){//代码}在这一层以及嵌套的function里分别alert(this)。可是实验结果是一样的。是不是说明这个观点是错误的?

疑问3:有人留言:关键是理清函数什么时候作为对象使用,什么时候作为函数使用。 这句话是如何理解的?我的理解是:要理清函数合何时为对象的函数(即方法)调用,何时作为一般函数使用。我这有理解有误么?
有劳诸位了。

 

2 个回答

陈曦输出价值,而非价值观

虽然这两个例子常见于大牛的博客,但个人觉得这两个例子作为闭包效果的例子的重点有些不明晰。

因为这两个例子反应出的知识点略多,作用域链,this的查找,返回函数,闭包等,最关键的是这两个例子都有闭包,产生的差异和闭包的关系略牵强,就容易让人疑惑,要说明的问题到底是什么。

先看闭包的定义:闭包函数_百度百科,个人觉得这个比维基讲得更清楚。

来看两个例子的调用过程。(即Object.getNameFunc()()到底干了什么)
例子1:调用Object的方法getNameFunc,返回匿名函数function () {return:this.name},存入内存并立刻调用这一函数,形成闭包。此时相当于在window的环境下调用函数,而不是在Object的环境下调用方法。此时this指向的是window对象。返回之前声明的window.name。

例子2:调用Object的方法getNameFunc,此时this为Object,将this赋给变量that,此时this指向Object,也就是将Object的引用赋给变量that。返回匿名函数function () {return:that.name},该匿名函数和that绑定在同一作用域,that不释放,形成闭包。再如同例子1,立刻调用此匿名函数,自然that.name就是Object.name,返回之。

明白这两个过程后,再来看你的三个疑问,应该就比较清晰了。
疑问1:两个例子都形成闭包。闭包的条件是:某个A函数作用域中的内部B函数被调用,B函数绑定并可操作本该释放的A函数中声明的变量(或更外部函数中声明的变量)。(A更外层的函数无法操作这些变量)

疑问2:这个人的观点是对的。虽然两个闭包看起来都保存了this。不过这里产生区别的主要原因涉及到this的指向是动态的,指向的是调用的环境。根据上述过程描述,例子1中this指向window,例子2中调用匿名函数时没有使用this,而是使用固定后的that。根据我的实验,实验结果一次是object,一次是window

疑问3:你的理解没误,看上述描述的调用过程就明白了吧。

啊,差点忘了,谢邀,我老早就想吐槽这个例子了来着。

2013-06-08 6 条评论       

rambojavascript程序员

好家伙 又是这个问题: 这个问题成景点啦啊 the windows the object
你的第一个问题: 可以参考 这个 没有依赖外部作用域对象的嵌套函数是不是闭包?
第二个问题: 请你看一段代码把

第三个问题: 我不知道怎么去理解 因为在js中 才是真正的一切皆对象 你调用function 其实就是在调用一个function提供给你的一套方法而已 所以你时时刻刻都是在用object啊

有那么一群人

有那么一群人,他们从来不用下岗,却在研究着你的退休。
有那么一群人,他们从来都不会失业,却在研究着你的下岗。
有那么一群人,他们从来不用交养老钱,却在研究着你的社保。
有那么一群人,他们从来不要买房,却在研究着你的房价。
有那么一群人,他们从来都不要买票,却在研究着你的票价。
有那么一群人,他们从来不要买油,却在研究着你的油价。
有那么一群人,儿孙都在美国,却在研究着你该如何爱国。

移动硬盘盒无法使用解决方案一例

今天在盒子里插入了一块SATA,结果win7上闪了一下后,并没有磁盘标志。原以为是线没插好,最后以为是盒子问题。

但是后来在磁盘管理中发现,磁盘已经被检测到了,但是显示为 “动态无效磁盘”,右键磁盘发现,有“转为基本磁盘”选项,于是尝试之,提示会丢失数据,继续,然后分配盘符,磁盘终于显示出来了。

那么,什么是动态磁盘?基本磁盘?

科普如下:

无论是基本磁盘还是动态磁盘,你都可以使用任何文件系统,包括FAT和NTFS。而且你可以在动态磁盘改变卷而不需要重启系统。你可以把一个基本磁盘转换成动态磁盘。但是你必须了解这并不是一个双向的过程。一旦你从基本磁盘变成了动态磁盘,除非你重新创建卷,或者使用一些磁盘工具(例如分区助手),否则你不能将它转变回去。
如同名字所暗示的那样,基本磁盘是IT专业人士最熟悉的类型。例如,基本磁盘包含了基本分区,扩展分区逻辑驱动器。使用基本分区,Windows NT系统也可以支持条码和软件RAID套件。而Windows 2000、Windows XP和 Windows Server 2003的基本磁盘不支持。

jquery easyui 1.3.2中datebox无法进行validatebox的解决方案

1.3.2中,datebox有一个bug,就是当form通过ajax加载内容后,其中的 datebox虽然能正常赋值,但是,这个datebox实际上是一个组合框,值通过一个隐藏域接收。此时如果这个datebox上带有validatebox,就会出问题,因为validatebox会去验证它的值,而其实它的值是存放在另外一个控件中的,就会造成始终无法通过该datebox。

解决方案:

在form的onLoadSuccess中,加入以下代码:

$(“#signUp input.combo-value”).each(function(){
$(“#signUp input[comboname=”+$(this).attr(“name”)+”]”).val($(this).val());
})

意思为给组合框双方都赋上值,即可解决该BUG。该BUG已在最新版本中修正,但是丫的不支持IE8.