上篇

IOS APP 国际化(实现不跟随系统语言,不用重启应用,代码切换stroyboard ,xib ,图片,其他资源

介绍了纯代码刷新 实现程序内切换语言。 但效率底下,也存在一些问题。暂放弃。

第二种是 从跟视图切换 storyboard 实现 代码结合 storyboard 刷新 UI,

上篇遗留的问题是,在开发的时候我们要用到 base.lproj 和 对应语言下得.string 文件。

方便开发(脚本实现 base storyboard 被编辑会 自动刷新对应语言的.string 文件。而不会覆盖掉之前翻译好的内容。)编译触发脚本

but  如果我要运行程序调试在 模拟器或真机上。我就要去掉base 。把对应语言.string 文件转换为.storyboard . 因为刷新sb 文件原理上就是去 app 包种的mainbundle 中 对应语言包下找 sb 文件。加载它。 如果对应语言包下 是。string 或 没有sb 文件则会奔溃。

来看: 这是对应 demo 工程 编译后的 app 包内容。 从 .storyboard 变成了 .storybardc  。这是xcode 编译 sb 文件后的 文件后缀名。

应该想到 如果我把 对应的.string 文件转换为.storyboardc 文件 拷贝到 对应app 包种的.Lproj 中。 是不是就可以啦。

so  各种嗨皮的 去搞在shell 中。 使用ibtool 转换.string 文件为.storyboard。 然后 修改 .storyboard 文件后缀 .storybardc 。拷贝到 app 包中。运行 切换语言奔溃。

靠,明明在 那个路径下。就是加载不到。 郁闷了几天。

可怎么能得到.storyboardc 文件? 使用ibtool 可以做到。 到这里你会以为 转换的.storyboardc 是个文件。其实 它跟.lproj  一样是个文件夹。

看 显示包内容。。   每个vc -> .nib 文件 还有.plist 清单。

到此如果我们有这个脚本,那么就太幸福啦。使用base 和对应语言.string 文件 编辑 运行程序也不用去掉。脚本生成对应语言.storyboardc 文件到

对应语言下同时存在.storyboardc 和 .string  这样一切问题得宜解决。  支持重设系统语言  和  程序内切换语言。 而且开发时只关心程序逻辑 翻译复制粘贴。 剩下的一切交给脚本搞定。

同样支持 xib 的国际化 ,工程中 可以同时用 sb 和 xib  或其中一个。

===================支持xib和sb中得图片国际化==========================

2015.4.30

demo 已更新,切换语言图片不会丢失。

说明:适用于不同语言使用相同图片在 sb 和 xib中。如果想不同语言使用不同图片在sb 和 xib 中的话,还是别折腾了吧。有那功夫还是直接在代码里写吧。

图片国际化实现过程:

由于在xib 和 sb 中添加Img 控件并不会在 对应.string 文件里有类似这样的记录

及  控件id =  “图片名”。这里记录得也只是控件的文本。默认并不会对图片国际化。

其实xib 和 sb 只是个xml 文件而已,

source Code  查看。

搜索image 可以查看ImageView 控件节点。当然也可以看到

resources 节点。。没错,这就是xib 和 sb 用到的资源。

到这里思路就有了。我是不是可以找到这些图片 分别拷贝到 不同语言包(xx.lproj)下面和 sb 或xib 一个目录。

脚本实现为 解析xml ,在

${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH} 【参见xcode 环境变量】下找到图片,在拷贝到对应文件夹下。

so easy。

由于当时也只是技术调研,并咩有真正做一个国际化的应用;如果有什么好需求可以在这里提...欢迎讨论和交流。

最终demo 在这里 :

https://github.com/githhhh/Test_Local_Two

以上还有些小不足,算是记录当时遇到的坑,推荐一个不错的解决方案:

虽然是swift ,但思路很不错。
http://blog.csdn.net/VictorMoKai/article/details/48894873

接管系统Bundle方法这样不需要在拷贝storyboardc文件到对应.lproj目录。

object_setClass(NSBundle.mainBundle(), BundleEx.self)

找到一个oc 版本:

https://github.com/maximbilan/ios_language_manager/blob/master/README.md

参考:

http://www.futuresvision.net/?p=1127

http://stackoverflow.com/questions/1371351/add-files-to-an-xcode-project-from-a-script

IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)的更多相关文章

  1. App内切换语言

    前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言.啥意思,就是 英.中.法.德.日...语言随意切换. (本案例采用Data-Bingding模式,麻麻再也不 ...

  2. iOS APP语言国际化之应用内切换语言环境

    最近接了一个项目,需求是要做一款应用的英文版本,客户并不清楚,以为要另做一个APP.沟通后告诉他们在之前应用基础上加个国际化功能就好,把之前的语言国际化重新梳理记录一下. 一般设置更改本地语言环境后, ...

  3. iOS开发--应用国际化,应用内切换语言

    1.前言 自己负责的项目需要做国际化,并且要求应用内部切换语言.这个是可以做到的,也并不难,可以直接戳Github看一下 https://github.com/leo90821/Localiztion ...

  4. iOS 国际化 (国际化文字内容不改变,app名字国际化,一键切换语言)

    首先我们要分三个步骤讲解怎么一步步实现app名字国际化.内容国际化.一键切换国际化的: 一.app设置内容或者可以说是app名字或者可以说Info.Plist中的东西国际化  app名字国际化  1. ...

  5. 解决Android 7.0 App内切换语言不生效的问题

    Android7.0及以前版本,Configuration中的语言相当于是App的全局设置: public static void changeAppLanguage(Context context, ...

  6. iOS APP 国际化

    pp Store 中很多流行的应用程序有多种语言版本.虽然这些应用程序可能因为很多因素而变得流行,但是具有多种本地化版本,肯定是其中一个因素.越多的人可以理解并使用您的应用程序,潜在的买家也就越多. ...

  7. Android 应用内切换语言

    extends :http://bbs.51cto.com/thread-1075165-1.html,http://www.cnblogs.com/loulijun/p/3164746.html 1 ...

  8. 在iOS项目中,这样才能完美的修改项目名称

    https://www.cnblogs.com/liangyi-cn/p/8657474.html 前言: 在iOS开发中,有时候想改一下项目的名字,这会遇到很多麻烦. 直接改项目名的话,Xcode不 ...

  9. 编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理

    原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下! 文章宗旨:Talk is cheap show me the code. 大成若缺,其 ...

随机推荐

  1. CSS中父元素高度没有随子元素高度的改变而改变,应该如何解决?

    如果子元素没有设置浮动(float),父元素实际上会根据内容,自动宽高进行适应的. 当子元素增加了浮动后,最简单的处理方法是给父元素添加overflow:hidden属性,此时父元素的高度会随子元素的 ...

  2. 【转】让Chrome化身成为摸鱼神器,利用Chorme运行布卡漫画以及其他安卓APK应用教程

    下周就是十一了,无论是学生党还是工作党,大家的大概都会有点心不在焉,为了让大家更好的心不在焉,更好的在十一前最后一周愉快的摸鱼,今天就写一个如何让Chrome(google浏览器)运行安卓APK应用的 ...

  3. 不用开发者账号打ipa包

    编译一下 , if -> Build Success  -> Show in Finder之后,将文件夹里的app直接拖入到iTunes里, 接着再iTunes里选中app -> S ...

  4. HTML回顾

    <frameset>和<body>是同一级的,已经在html5中被弃用    结合---->    效果   注意::::span标签不自动换行****

  5. 表单验证代码实例:jquery.validate.js表单验证插件

    jquery.validate.js是JQuery旗下的一个验证插件,借助JQuery的优势,我们可以迅速验证一些常见的输入,并且可以自己扩充自己的验证方法.使用前请先下载必要的JQuery插件:jq ...

  6. linux 禁ping本机方法

    linux 禁ping本机方法 禁ping执行:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 恢复ping 执行:echo 0 > /p ...

  7. 技术文档--svn

    1.什么是版本控制,说出常见的版本控制系统及其区别版本控制它是一种软件工程籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新,它透过文档控制记录程序各个模块的改动,并为每次改动编上序号,并且编 ...

  8. Android View 如何绘制

    上文说道了Android如何测量,但是一个漂亮的控件我只知道您长到哪儿,这当然不行.只需要简单重写OnDraw方法,并在Canvas(画布)对象上调用那根五颜六色的画笔就能够画出这控件"性感 ...

  9. 【NetDIY智能主控】开发计划

    经过一个轮回,硬件开发.硬件创业又被推到了历史的前台. 面向低端.初级的硬件爱好者,以Arduino和81单片开发板为核心的开源硬件越来越深入人心,参与的人群越来越多,相关硬件和周边模块也越来越便宜. ...

  10. 跟我一起学WCF(7)——WCF数据契约与序列化详解

    一.引言 在前面博文介绍到,WCF的契约包括操作契约.数据契约.消息契约和错误契约,前面一篇博文已经结束了操作契约的介绍,接下来自然就是介绍数据契约了.所以本文要分享的内容就是数据契约. 二.数据契约 ...