CN113961300A - 一种iOS APP字符串资源文件翻译方法及系统 - Google Patents
一种iOS APP字符串资源文件翻译方法及系统 Download PDFInfo
- Publication number
- CN113961300A CN113961300A CN202111537027.0A CN202111537027A CN113961300A CN 113961300 A CN113961300 A CN 113961300A CN 202111537027 A CN202111537027 A CN 202111537027A CN 113961300 A CN113961300 A CN 113961300A
- Authority
- CN
- China
- Prior art keywords
- character string
- translation
- file
- source language
- interface
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/451—Execution arrangements for user interfaces
- G06F9/454—Multi-language systems; Localisation; Internationalisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/40—Processing or translation of natural language
- G06F40/58—Use of machine translation, e.g. for multi-lingual retrieval, for server-side translation for client devices or for real-time translation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Health & Medical Sciences (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Human Computer Interaction (AREA)
- Artificial Intelligence (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种iOS APP字符串资源文件翻译方法,包括:加载源语言资源Bundle文件夹,获取源语言strings文件中字符串标识对应的源语言字符串,在iOS系统加载返回NSString对象,NSString对象的值为源语言字符串,创建对应的界面控件添加到APP显示界面;将每一个NSString对象与字符串标识和表名进行关联;根据翻译请求信息中控件标识获取对应的NSString对象,获取关联的表名和字符串标识,根据获取得到的表名和字符串标识以及目标语言字符串创建目标语言资源Bundle文件夹,目标语言资源Bundle文件夹包括目标语言strings文件,基于每一次翻译请求信息对所创建的目标语言strings文件进行更新,得到实时更新的目标语言资源Bundle文件夹。通过本发明能够实现实时翻译实时更新的功能。
Description
技术领域
本发明涉及字符串资源翻译技术领域,尤其涉及一种iOS APP字符串资源文件翻译方法及系统。
背景技术
对APP进行国际化是将APP服务推向全球的基本要求之一。APP国际化是指将APP中人机界面交互时出现的文字、声音、图片等翻译成不同语种,以满足不同国家和地区用户的使用需求,也就是“翻译”工作。APP国际化具体包括:用户界面(UI)中字符串资源的国际化、图片资源的国际化和音视频资源的国际化。其中,用户界面中的字符串是数量最为庞大、维护更新最为频繁的一类资源。
对APP字符串资源的国际化,现在一般分为两种做法:一种方案是在APP的用户界面设计阶段开始国际化工作,该方案是通过光学字符识别(OCR)等技术或者人工方式,提取设计图稿中的文字资源,将文字资源翻译成目标语言后,提供给开发人员,该方案的缺点是:国际化工作介入太早,后期在开发和测试阶段可能需要对界面进行修改迭代,会浪费前期国际化的工作成果;开发人员在软件开发过程中,需要同时维护多份目标语言资源Bundle文件夹,维护工作量大容易出错。另一种方案是在APP使用主语言开发完成后,提取出工程中的字符串资源文件,建立某种映射表(即字符串键key与字符串值value的映射关系,在软件工程中使用字符串键key而不是最终的语言字符串),将该映射表提供给专业的翻译人员翻译成目标文件,然后开发人员将翻译好的新的目标语言资源文件合并入工程文件中,并制作包含目标语言资源文件的APP安装包,该方案存在的问题有:由于缺少上下文(Context)语境,单纯从工程中的字符串资源映射表,很难关联到合适的目标语言词汇,比如“打开”一词,就有“Power On”、“On”、“Open”、“Enable”、“Turn on”等多种翻译方法,缺少语境时(比如原文为“打开电源开关”还是“打开选项”)就很难选择;用不同的目标语言表达相同的含义、语句或单词的长短差异很大,常常会出现翻译完成的完整句子,在显示界面时由于空间不够导致被截断或者产生省略符号,反之亦然,使用了过于简短的词句,反而浪费了宝贵的界面显示空间。因此,为了选择合适的文字长度,需要反复的修改文字资源、打包APP安装包、运行测试、再次修改等,这种离线翻译的方法,效率低下;映射文件表的结构化格式容易被破坏,在实际中,映射文件表需要遵循一定的文件结构格式,才能够被程序加载,这种文件格式的要求会使翻译内容中出现各种转义符、分隔符等特殊符号,对翻译人员的软件工程水平提出了一定的要求。实际上在开发过程中,我们先后尝试使用过文本文件、Excel表格以及开发专用网站使用网页填写的方式,但是都会存在一些文件格式转换的问题。
发明内容
有鉴于此,本发明的目的在于提供一种iOS APP字符串资源文件翻译方法及系统,能够实现实时翻译实时更新的功能。
为实现上述目的,本发明提供了一种iOS APP字符串资源文件翻译方法,所述方法包括:
S1、构建iOS APP可执行文件包,所述iOS APP可执行文件包中至少包括源语言资源Bundle文件夹,所述源语言资源Bundle文件夹至少包括一个源语言strings文件,每一个源语言strings文件包括多个字符串标识和多个源语言字符串,所述多个字符串标识和多个源语言字符串一一对应,每一个源语言strings文件用唯一的表名以标识;
S2、加载所述源语言资源Bundle文件夹,获取每一个源语言strings文件中的每一个字符串标识所对应的源语言字符串,该源语言字符串在iOS系统加载返回对应的NSString对象,该NSString对象的值对应为所述源语言字符串,根据所述NSString对象至少创建一个界面控件,所述界面控件具有唯一的控件标识,基于每一个源语言字符串创建对应的界面控件,将每一个创建的界面控件添加到APP显示界面上,构建为一翻译界面;
S3、将每一个NSString对象与字符串标识和表名进行关联;
S4、接收来自所述翻译界面的翻译请求信息,所述翻译请求信息包括一触发的控件标识和对应的翻译后的目标语言字符串,根据所述触发的控件标识获取对应的界面控件在创建时提供的NSString对象,从NSString对象中获取关联的表名和字符串标识,并根据所述获取得到的表名和字符串标识以及对应的目标语言字符串创建目标语言资源Bundle文件夹,其中,所述目标语言资源Bundle文件夹包括对应该表名的目标语言strings文件,所述目标语言strings文件包括字符串标识和对应的目标语言字符串;
S5、重复执行所述步骤S4,基于每一次翻译请求信息对所创建的目标语言strings文件进行更新,得到实时更新的目标语言资源Bundle文件夹。
进一步的,所述方法还包括:
根据获取的界面控件的控件标识获取对应的NSString对象,根据所述NSString对象获取该NSString对象所关联的字符串标识和表名;
根据所述所关联的字符串标识和表名在所述目标语言资源Bundle文件夹查找到对应该表名的目标语言strings文件,并在所述目标语言strings文件中查找所关联的字符串标识所对应的目标语言字符串,若查找并加载成功,对加载成功的NSString对象关联字符串标识和表名后返回,NSString对象的值为所述目标语言字符串,在所述翻译界面上显示所述目标语言字符串;
若查找不成功,则根据所述所关联的字符串标识和表名在所述源语言资源Bundle文件夹查找到对应该表名的源语言strings文件,并在所述源语言strings文件中查找所关联的字符串标识所对应的源语言字符串,若查找并加载成功,对加载成功的NSString对象关联字符串标识和表名后返回,NSString对象的值为所述源语言字符串,在翻译界面上显示所述源语言字符串,若查找不成功,则返回系统缺省值。
进一步的,所述对加载成功的NSString对象关联字符串标识和表名的步骤具体包括:
构建localizedStringForKey_replacement函数,该函数的接收参数包括key、value、table,key对应为字符串标识,value为缺省值,table对应为表名;
加载字符串时,调用iOS字符串的接口,将localizedStringForKey_replacement函数代替iOS系统原有的localizedStringForKey函数执行字符串加载功能,并在字符串加载成功之后,将加载成功的NSString对象关联字符串标识、缺省值以及表名后返回。
进一步的,通过下面代码实现NSString对象与字符串标识、缺省值以及表名的关联:
objc_setAssociatedObject(val,&kKVTPair,kvt,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
其中,val 表示NSString对象,kKVTPair 表示常量,kvt中的k表示字符串标识,v表示缺省值,t表示表名。
进一步的,所述方法还包括:根据触发的界面控件的控件标识以及NSString对象所关联的字符串标识和表名,对该界面控件通过performSelector发送消息setText,并以NSString对象为一个消息参数。
进一步的,所述方法还包括:
通过调用class_addMethod方法向UIWindow类添加自定义的hitTest方法,在自定义的hitTest方法中,获取用户的点击界面控件的事件和点击坐标,根据点击坐标在UIWindow中所有的可显示控件树中查询,若该点击坐标为翻译界面的待翻译控件,则作为待翻译操作的目标控件,若不是,则继续循环迭代查找。
进一步的,将实现所述步骤S1-S5的功能以即时翻译插件形式加载到所述APP可执行文件中。
进一步的,在所述翻译界面设置一用于“翻译模式”和“正常模式”切换的浮动窗口,点击浮动窗口可在所述“翻译模式”和“正常模式”之间切换,当切换后处于“翻译模式”时,翻译界面执行翻译功能,当切换后处于“正常模式”时,翻译界面执行原有的界面显示功能。
进一步的,当处于“翻译模式”时,点击翻译界面的待翻译界面控件时,将弹出一编辑框供翻译人员输入对应的翻译后的语言文字。
为实现上述目的,本发明提供了一种iOS APP字符串资源文件翻译系统,所述系统包括:
可执行文件模块,构建iOS APP可执行文件包,所述iOS APP可执行文件包中至少包括源语言资源Bundle文件夹,所述源语言资源Bundle文件夹至少包括一个源语言strings文件,每一个源语言strings文件包括多个字符串标识和多个源语言字符串,所述多个字符串标识和多个源语言字符串一一对应,每一个源语言strings文件用唯一的表名以标识;
界面显示模块,加载所述源语言资源Bundle文件夹,获取每一个源语言strings文件中的每一个字符串标识所对应的源语言字符串,该源语言字符串在iOS系统加载返回对应的NSString对象,该NSString对象的值对应为所述源语言字符串,根据所述NSString对象至少创建一个界面控件,所述界面控件具有唯一的控件标识,基于每一个源语言字符串标识创建对应的界面控件,将每一个创建的界面控件添加到APP显示界面上,构建为一翻译界面;
关联模块,将每一个NSString对象与字符串标识和表名进行关联;
实时翻译模块,接收来自所述翻译界面的翻译请求信息,所述翻译请求信息包括一触发的控件标识和对应的翻译后的目标语言字符串,根据所述触发的控件标识获取对应的界面控件在创建时提供的NSString对象,从NSString对象中获取关联的表名和字符串标识,并根据所述获取得到的表名和字符串标识以及对应的目标语言字符串创建目标语言资源Bundle文件夹,其中,所述目标语言资源Bundle文件夹包括对应该表名的目标语言strings文件,所述目标语言strings文件包括字符串标识和对应的目标语言字符串,基于每一次翻译请求信息对所创建的目标语言strings文件进行更新,得到实时更新的目标语言资源Bundle文件夹。
与现有技术相比,本发明一种iOS APP字符串资源文件翻译方法及系统,所带来的有益效果为:翻译人员在运行使用iOS APP过程中,通过点按等方式,即时地对看到的文字资源进行翻译的技术方案,能够实现实时翻译实时更新的功能;该方案可以插件的形式包含在APP工程文件中,无需修改已有的APP的工程源码,只要在构建过程中包含该插件,即可包含本发明所实现的翻译功能,当翻译功能完成后,在构建正式版本时排除该插件,就可以得到不包含翻译功能的软件包;使用了拦截iOS系统调用的功能,因此对于APP工程代码是无感的,不需要为翻译功能而付出额外的工作。
附图说明
图1是根据本发明的一个实施例中iOS APP字符串资源文件翻译方法的流程示意图;
图2是根据本发明的一个实施例中Bundle文件夹示意图;
图3是根据本发明的一个实施例中待翻译界面示意图;
图4是根据本发明的一个具体实施例中翻译示意图;
图5是根据本发明的一个具体实施例中翻译示意图;
图6是根据本发明的一个实施例中iOS APP字符串资源文件翻译系统的系统示意图。
具体实施方式
以下将结合附图所示的具体实施方式对本发明进行详细描述,但这些实施方式并不限制本发明,本领域的普通技术人员根据这些实施方式所做出的结构、方法、或功能上的变换均包含在本发明的保护范围内。
如图1所示的本发明一实施例中,本发明提供一种iOS APP字符串资源文件翻译方法,所述方法包括:
S1、构建iOS APP可执行文件包, iOS APP可执行文件包中至少包括源语言资源Bundle文件夹,源语言资源Bundle文件夹至少包括一个源语言strings文件,每一个源语言strings文件包括多个字符串标识和多个源语言字符串,多个字符串标识和多个源语言字符串一一对应,每一个源语言strings文件用唯一的表名以标识;
S2、加载源语言资源Bundle文件夹,获取每一个源语言strings文件中的每一个字符串标识所对应的源语言字符串,该源语言字符串在iOS系统加载返回对应的NSString对象,该NSString对象的值对应为所述源语言字符串,根据所述NSString对象至少创建一个界面控件,界面控件具有唯一的控件标识,基于每一个源语言字符串创建对应的界面控件,将每一个创建的界面控件添加到APP显示界面上,构建为一翻译界面;
S3、将每一个NSString对象与字符串标识和表名进行关联;
S4、接收来自翻译界面的翻译请求信息,翻译请求信息包括一触发的控件标识和对应的翻译后的目标语言字符串,根据触发的控件标识获取对应的界面控件在创建时提供的NSString对象,从NSString对象中获取关联的表名和字符串标识,并根据获取得到的表名和字符串标识以及对应的目标语言字符串创建目标语言资源Bundle文件夹,其中,目标语言资源Bundle文件夹包括对应该表名的目标语言strings文件,目标语言strings文件包括字符串标识和对应的目标语言字符串;
S5、重复执行步骤S4,基于每一次翻译请求信息对所创建的目标语言strings文件进行更新,得到实时更新的目标语言资源Bundle文件夹。
构建iOS APP可执行文件包就是软件包构建过程,将工程源码编译,并和资源一起制作可安装执行的软件包,iOS APP可执行文件包指iOS可运行的应用软件包。源语言不是指软件开发中的编程语言,是指翻译之前的语言,比如中文字符串翻译成英文字符串,那么源语言就是中文,目标语言就是英文。APP可执行文件包中包括源语言资源Bundle文件夹。源语言Bundle文件夹中至少包括一个源语言strings文件,每一个源语言strings文件包括多个字符串标识和多个源语言字符串,所述多个字符串标识和源语言的字符串一一对应,每一个源语言strings文件用唯一的表名以标识。源语言Bundle文件夹的物理存储形式为lproj类型的文件夹,不同语言的Bundle文件夹具有不同的命名规则,即文件夹的名称决定了语言的种类,如图2中所示,zh-Hans.lproj表示中文简体Bundle文件夹,en.lproj表示英文Bundle文件夹,文件夹的名称决定了语言的种类,每种语言在国际标准中都有唯一的编码。源语言Bundle文件夹中包括至少一个源语言strings文件,strings文件可按照业务功能对strings文件进行分类,strings文件用唯一的表名以标识。比如zh-Hans.lproj文件夹包括Settings.strings文件和EngineMode.strings文件, Settings.strings表示设置功能相关的strings文件,其表名为Settings,EngineMode.strings文件表示工程模式相关的strings文件,其表名为EngineMode。源语言strings中包括多个字符串标识和多个源语言字符串,每一个字符串标识与源语言字符串一一对应,字符串标识与源语言字符串表现为键值对形式,如图2中所示,比如Login.strings文件中包含" add_device "="添加已配置的智慧设备",其中“add_device”表示为字符串标识,“添加已配置的智慧设备” 表示为对应的中文字符串。同一语言strings文件中字符串标识是唯一的,不同语言的strings文件中的字符串标识可以是重复的。因此,基于表名和字符串标识就可以确定源语言字符串的唯一性。
加载源语言资源Bundle文件夹,一般Bundle文件夹与不同语言的lproj文件夹相对应,加载哪个语言的lproj文件夹基于终端所使用的语言环境,比如手机语言使用中文简体时,则优先加载zh-Hans.lproj目录下的文件,手机语言使用英文时,则优先加载en.lproj目录下的文件。在源语言strings文件中查询每一个字符串标识对应的源语言字符串,该源语言字符串在iOS系统返回对应的NSString对象,该NSString对象的值对应为源语言字符串。根据NSString对象至少创建一个界面控件,一个NSString对象可创建一个或者多个界面控件。界面控件具有唯一的控件标识。基于每一个源语言字符串创建对应的界面控件,将每一个创建的界面控件添加到APP显示界面上,构建为一翻译界面。比如Settings.strings文集中设置" add_device "="添加已配置的智慧设备",在加载时查询到对应的源语言字符串“添加已配置的智慧设备”,系统加载后返回对应的NSString对象,即返回值为“添加已配置的智慧设备”的NSString对象,创建对应的界面控件,对应的内容“添加已配置的智慧设备”也显示在界面控件上,因而创建每一个界面控件,将每一个创建的界面控件添加到APP显示界面上,构建为一个翻译界面。
将每一个NSString对象与字符串标识和表名进行关联。在实时翻译过程中,为实现源代码无侵入特性,即原始的代码不需要修改就能够实现翻译界面中字符串的动态切换,从而能够实现实时翻译的功能,因此需要将NSString对象与字符串标识和表名进行关联。通过下面代码实现NSString对象与字符串标识、缺省值以及表名的关联:
objc_setAssociatedObject(val,&kKVTPair,kvt,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
其中,val 表示NSString对象,kKVTPair 表示常量,kvt中的k表示字符串标识,v表示缺省值,t表示表名。基于该代码实现对NSString对象的扩展,将其与字符串标识、缺省值以及表名的关联。
和源语言Bundle文件夹一样,创建对应的目标语言Bundle文件夹,Bundle文件夹的命名与对应的目标语言种类一致。在目标语言的Bundle文件夹下创建对应的目标语言strings文件。接收来自所述翻译界面的翻译请求信息,翻译请求信息包括一触发的控件标识和对应的翻译后的目标语言字符串。根据触发的控件标识,获取控件的NSString对象,再从NSString对象中获取关联的表名和字符串标识,并根据获取得到的表名和字符串标识以及对应的目标语言字符串创建目标语言资源Bundle文件夹。目标语言资源Bundle文件夹的名称以目标语言来标识,即目标语言的lproj文件夹,在目标语言的lproj文件夹中根据表名创建对应的目标语言strings文件,目标语言strings文件用该表名来标识,在目标语言strings文件中创建字符串标识和对应的目标语言字符串,比如写入" user_id "="UserName",将对应该表名的所有的字符串标识和对应的目标语言字符串写入到目标语言strings文件中。基于上述技术方案,根据每一次翻译人员所点击的界面控件,根据获取的所点击的界面控件所对应的翻译后的目标语言字符串,对创建的目标语言strings文件进行更新。同样的,不同的翻译界面,所创建和更新的目标语言strings可能文件不同,从而得到实时更新的目标语言资源Bundle文件夹。开发过程中,当最后翻译完成之后,将得到的最后更新的目标语言资源Bundle文件夹合并入APP的工程文件中,以供下次的APP工程构建使用。
在翻译过程中,经常会出现完成部分翻译工作后,可能停止翻译后,又再启动翻译工作,因此需要重新加载APP执行文件,但是原有的APP执行文件中所包含的语言资源文件是基于源语言的,如果加载源语言资源Bundle文件夹的话,那么之前的翻译工作就白做了,因此在界面上需要提供已经翻译的部分显示翻译后的文字内容(即加载目标语言Bundle文件夹),而没有翻译的部分显示翻译前的文字内容(即加载源语言Bundle文件夹)。因此本发明提供一种可实现的技术方案,根据获取的界面控件的控件标识获取 到对应的NSString对象,根据NSString对象获取到该NSString对象所关联的字符串标识和表名;根据所关联的字符串标识和表名在目标语言资源Bundle文件夹查找到对应该表名的目标语言strings文件,并在目标语言strings文件中查找所关联的字符串标识所对应的目标语言字符串,若查找并加载成功,对加载成功的NSString对象关联字符串标识和表名后返回,NSString对象的值为目标语言字符串,在翻译界面上显示目标语言字符串;若查找不成功,则根据所关联的字符串标识和表名在源语言资源Bundle文件夹查找到对应该表名的源语言strings文件,并在源语言strings文件中查找所关联的字符串标识所对应的源语言字符串,若查找并加载成功,对加载成功的NSString对象关联字符串标识和表名后返回,NSString对象的值为源语言字符串,在翻译界面上显示源语言字符串,若查找不成功,则返回系统缺省值。根据该技术方案,通过优先加载目标语言资源Bundle文件夹,实现了字符串资源首先从目标语言资源Bundle文件加载,如果字符串匹配失败后再从源语言资源Bundle文件加载,从而实现了翻译界面的动态显示和翻译工作的随时性和动态性,不需要重新打包APP执行文件,给翻译人员带来方便和更高的翻译效率。
作为本发明的一种实现方式,通过拦截iOS系统原有的加载字符串接口函数的技术方案,实现优先加载目标语言资源Bundle文件的功能,并关联字符串标识和表名到加载返回的NSString对象。作为本发明的一种实现方式,构建localizedStringForKey_replacement函数,该函数的参数包括key、value、table,key对应为字符串标识,value为缺省值,table对应为表名。iOS系统原有的加载字符串接口函数localizedStringForKey中设有三个参数key、value、table,因此构建的函数也对应的设有三个参数,以满足系统函数可用。APP加载字符串时,调用iOS加载字符串的接口,将localizedStringForKey_replacement函数代替iOS系统原有的localizedStringForKey函数执行字符串加载功能,并在字符串加载成功之后,将加载成功的NSString对象关联字符串标识、缺省值以及表名后返回。其代码为:
(NSString*)localizedStringForKey:(NSString*)key value:(NSString *)value table:(NSString *)table;
通过拦截原有的接口函数,不执行iOS系统中原有的函数,而执行本发明所定义的函数,实现了NSString对象的关联。
在翻译过程中,需要对翻译后的文字内容实时显示,每当翻译编辑完成一个字符串之后,将新的字符串内容更新到缓存或文件中,然后需要触发界面控件进行界面刷新以获得实时的显示效果,因此本发明通过向界面控件发送setText等消息,无需额外的代码而使翻译的文字内容直接更新到界面控件,达到实时预览修改效果。作为本发明的一种实现方式,根据触发的界面控件的控件标识以及NSString对象所关联的字符串标识和表名,对该界面控件通过performSelector发送消息setText,并以NSString对象为一个消息参数,从而实现更新界面控件的显示内容。
缺省的UILable等控件是不响应点击操作的,另外UIButton、UIMenu等可点击控件一般也会在APP中有特定的作用,以实现收到界面控件点击事件后执行具体的业务功能。为了在“翻译模式”下实现点击文字进行弹窗输入的效果,并且不影响原有界面控件的点击功能,需要在更高优先级层面上对用户的点击操作进行拦截和识别。在实现中,通过拦截UIWindow 的 hitTest 消息可以获得用户的所有点击事件及点击坐标,再通过分析以UIWindow为根的所有可显示控件树,寻找合适的界面控件,作为待翻译操作的目标控件。当处于“普通模式”时,就不拦截UIWindow的hitTest消息,从而识别点击和翻译的功能不会工作。作为本发明的一种实现方式,通过调用class_addMethod方法向UIWindow类添加自定义的hitTest方法,在自定义的hitTest方法中,获取用户的点击界面控件的事件和点击坐标,根据点击坐标在UIWindow中所有的可显示控件树中查询,若该点击坐标为翻译界面的待翻译控件,则作为待翻译操作的目标控件,若不是,则继续循环迭代查找。
作为本发明的一种实现方式,为达到对源工程代码的无侵入性,本发明采用静态库的形式提供,源工程只需要链接并使用一行代码初始化插件,就能够实现本发明的功能。将实现所述步骤S1-S5的功能以即时翻译插件形式加载到所述APP可执行文件中。将本发明实现的功能以插件形式包含在APP可执行文件中,无需修改已有的APP工程源码,在开发过程的软件构建过程中包含该插件,就实现实时翻译功能,等翻译工作全部完成之后,在APP正式版本发布前,将该插件从APP工程中删除,并构建发布版本的APP软件包,发布版本的软件包就不包含有翻译功能。
作为本发明的一种实现方式,在所述翻译界面设置一用于“翻译模式”和“正常模式”切换的浮动窗口,点击浮动窗口的按钮,实现在这两种模式之间的相互切换,当切换后处于“翻译模式”时,翻译界面执行翻译功能,当处于翻译模式时,翻译插件拦截接管APP窗口中所有的点击事件,查找包含该点击位置待翻译的控件,并执行翻译功能。当切换后处于“正常模式”时,翻译界面执行原有的界面显示功能,即没有翻译功能,翻译插件不会拦截APP窗口的点击事件,App将接受到点击事件,执行原有的界面显示功能。如图3所示的一个翻译界面的示意图。
如图4所示的翻译界面的示意图,翻译人员执行翻译功能时,当处于“翻译模式”时,点击翻译界面的一界面控件时,将弹出一编辑框供翻译人员输入对应的翻译后的语言文字,并进行保存。当处于翻译模式时,APP原有的点击滚动等操作将被拦截,无法操作。图4中,点击“添加已配置的智慧设备”这个控件时,弹出“输入文本”这个编辑框,在该窗口中输入对应的英文翻译文字,然后点击确定以保存。点击确定后的输入的英文翻译文字内容即时在界面上进行显示,如图5所示。从图5中的左半边图可以看出,如果翻译的英文内容太长,导致出现省略号,所以需要对翻译的英文内容进行重新编辑优化,以适合界面上翻译内容的长度,如图5中的右半边图可以看出,换一种翻译的英文内容后就不会出现省略号了,这正是本发明实时翻译的有益效果,实时翻译实时修改实时保存,实现了所见即所得的翻译效果。
如图6所示,本发明提供一种iOS APP语言资源实时翻译系统,所述系统包括:
可执行文件模块60,构建iOS APP可执行文件包, iOS APP可执行文件包中至少包括源语言资源Bundle文件夹,源语言资源Bundle文件夹至少包括一个源语言strings文件,每一个源语言strings文件包括多个字符串标识和多个源语言字符串,多个字符串标识和多个源语言字符串一一对应,每一个源语言strings文件用唯一的表名以标识;
界面显示模块61,加载源语言资源Bundle文件夹,获取每一个源语言strings文件中的每一个字符串标识所对应的源语言字符串,该源语言字符串在iOS系统加载返回对应的NSString对象,该NSString对象的值对应为所述源语言字符串,根据所述NSString对象至少创建一个界面控件,界面控件具有唯一的控件标识,基于每一个源语言字符串标识创建对应的界面控件,将每一个创建的界面控件添加到APP显示界面上,构建为一翻译界面;
关联模块62,将每一个NSString对象与字符串标识和表名进行关联;
实时翻译模块63,接收来自翻译界面的翻译请求信息,翻译请求信息包括一触发的控件标识和对应的翻译后的目标语言字符串,根据触发的控件标识获取对应的界面控件创建时提供的NSString对象,从NSString对象中获取 关联的表名和字符串标识,并根据获取得到的表名和字符串标识以及对应的目标语言字符串创建目标语言资源Bundle文件夹,其中,目标语言资源Bundle文件夹包括对应该表名的目标语言strings文件,目标语言strings文件包括字符串标识和对应的目标语言字符串,基于每一次翻译请求信息对所创建的目标语言strings文件进行更新,得到实时更新的目标语言资源Bundle文件夹。
尽管为示例目的,已经公开了本发明的优选实施方式,但是本领域的普通技术人员将意识到,在不脱离由所附的权利要求书公开的本发明的范围和精神的情况下,各种改进、增加以及取代是可能的。
Claims (10)
1.一种iOS APP字符串资源文件翻译方法,其特征在于,所述方法包括步骤:
S1、构建iOS APP可执行文件包,所述iOS APP可执行文件包中至少包括源语言资源Bundle文件夹,所述源语言资源Bundle文件夹至少包括一个源语言strings文件,每一个源语言strings文件包括多个字符串标识和多个源语言字符串,所述多个字符串标识和多个源语言字符串一一对应,每一个源语言strings文件用唯一的表名以标识;
S2、加载所述源语言资源Bundle文件夹,获取每一个源语言strings文件中的每一个字符串标识所对应的源语言字符串,该源语言字符串在iOS系统加载返回对应的NSString对象,该NSString对象的值对应为所述源语言字符串,根据所述NSString对象至少创建一个界面控件,所述界面控件具有唯一的控件标识,基于每一个源语言字符串创建对应的界面控件,将每一个创建的界面控件添加到APP显示界面上,构建为一翻译界面;
S3、将每一个NSString对象与字符串标识和表名进行关联;
S4、接收来自所述翻译界面的翻译请求信息,所述翻译请求信息包括一触发的控件标识和对应的翻译后的目标语言字符串,根据所述触发的控件标识获取对应的界面控件在创建时提供的NSString对象,从NSString对象中获取关联的表名和字符串标识,并根据所述获取得到的表名和字符串标识以及对应的目标语言字符串创建目标语言资源Bundle文件夹,其中,所述目标语言资源Bundle文件夹包括对应该表名的目标语言strings文件,所述目标语言strings文件包括字符串标识和对应的目标语言字符串;
S5、重复执行所述步骤S4,基于每一次翻译请求信息对所创建的目标语言strings文件进行更新,得到实时更新的目标语言资源Bundle文件夹。
2.如权利要求1所述的iOS APP字符串资源文件翻译方法,其特征在于,所述方法还包括:
根据获取的界面控件的控件标识获取对应的NSString对象,根据所述NSString对象获取该NSString对象所关联的字符串标识和表名;
根据所述所关联的字符串标识和表名在所述目标语言资源Bundle文件夹查找到对应该表名的目标语言strings文件,并在所述目标语言strings文件中查找所关联的字符串标识所对应的目标语言字符串,若查找并加载成功,对加载成功的NSString对象关联字符串标识和表名后返回,NSString对象的值为所述目标语言字符串,在所述翻译界面上显示所述目标语言字符串;
若查找不成功,则根据所述所关联的字符串标识和表名在所述源语言资源Bundle文件夹查找到对应该表名的源语言strings文件,并在所述源语言strings文件中查找所关联的字符串标识所对应的源语言字符串,若查找并加载成功,对加载成功的NSString对象关联字符串标识和表名后返回,NSString对象的值为所述源语言字符串,在翻译界面上显示所述源语言字符串,若查找不成功,则返回系统缺省值。
3.如权利要求2所述的iOS APP字符串资源文件翻译方法,其特征在于,所述对加载成功的NSString对象关联字符串标识和表名的步骤具体包括:
构建localizedStringForKey_replacement函数,该函数的接收参数包括key、value、table,key对应为字符串标识,value为缺省值,table对应为表名;
加载字符串时,调用iOS字符串的接口,将localizedStringForKey_replacement函数代替iOS系统原有的localizedStringForKey函数执行字符串加载功能,并在字符串加载成功之后,将加载成功的NSString对象关联字符串标识、缺省值以及表名后返回。
4.如权利要求3所述的iOS APP字符串资源文件翻译方法,其特征在于,通过下面代码实现NSString对象与字符串标识、缺省值以及表名的关联:
objc_setAssociatedObject(val,&kKVTPair,kvt,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
其中,val 表示NSString对象,kKVTPair 表示常量,kvt中的k表示字符串标识,v表示缺省值,t表示表名。
5.如权利要求3所述的iOS APP字符串资源文件翻译方法,其特征在于,所述方法还包括:根据触发的界面控件的控件标识以及NSString对象所关联的字符串标识和表名,对该界面控件通过performSelector发送消息setText,并以NSString对象为一个消息参数。
6.如权利要求5所述的iOS APP字符串资源文件翻译方法,其特征在于,所述方法还包括:通过调用class_addMethod方法向UIWindow类添加自定义的hitTest方法,在自定义的hitTest方法中,获取用户的点击界面控件的事件和点击坐标,根据点击坐标在UIWindow中所有的可显示控件树中查询,若该点击坐标为翻译界面的待翻译控件,则作为待翻译操作的目标控件,若不是,则继续循环迭代查找。
7.如权利要求1所述的iOS APP字符串资源文件翻译方法,其特征在于,将实现所述步骤S1-S5的功能以即时翻译插件形式加载到所述APP可执行文件中。
8.如权利要求7所述的iOS APP字符串资源文件翻译方法,其特征在于,在所述翻译界面设置一用于“翻译模式”和“正常模式”切换的浮动窗口,点击浮动窗口可在所述“翻译模式”和“正常模式”之间切换,当切换后处于“翻译模式”时,翻译界面执行翻译功能,当切换后处于“正常模式”时,翻译界面执行原有的界面显示功能。
9.如权利要求8所述的iOS APP字符串资源文件翻译方法,其特征在于,当处于“翻译模式”时,点击翻译界面的待翻译界面控件时,将弹出一编辑框供翻译人员输入对应的翻译后的语言文字。
10.一种iOS APP字符串资源文件翻译系统,其特征在于,所述系统包括:
可执行文件模块,构建iOS APP可执行文件包,所述iOS APP可执行文件包中至少包括源语言资源Bundle文件夹,所述源语言资源Bundle文件夹至少包括一个源语言strings文件,每一个源语言strings文件包括多个字符串标识和多个源语言字符串,所述多个字符串标识和多个源语言字符串一一对应,每一个源语言strings文件用唯一的表名以标识;
界面显示模块,加载所述源语言资源Bundle文件夹,获取每一个源语言strings文件中的每一个字符串标识所对应的源语言字符串,该源语言字符串在iOS系统加载返回对应的NSString对象,该NSString对象的值对应为所述源语言字符串,根据所述NSString对象至少创建一个界面控件,所述界面控件具有唯一的控件标识,基于每一个源语言字符串标识创建对应的界面控件,将每一个创建的界面控件添加到APP显示界面上,构建为一翻译界面;
关联模块,将每一个NSString对象与字符串标识和表名进行关联;
实时翻译模块,接收来自所述翻译界面的翻译请求信息,所述翻译请求信息包括一触发的控件标识和对应的翻译后的目标语言字符串,根据所述触发的控件标识获取对应的界面控件在创建时提供的NSString对象,从NSString对象中获取关联的表名和字符串标识,并根据所述获取得到的表名和字符串标识以及对应的目标语言字符串创建目标语言资源Bundle文件夹,其中,所述目标语言资源Bundle文件夹包括对应该表名的目标语言strings文件,所述目标语言strings文件包括字符串标识和对应的目标语言字符串,基于每一次翻译请求信息对所创建的目标语言strings文件进行更新,得到实时更新的目标语言资源Bundle文件夹。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111537027.0A CN113961300A (zh) | 2021-12-16 | 2021-12-16 | 一种iOS APP字符串资源文件翻译方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111537027.0A CN113961300A (zh) | 2021-12-16 | 2021-12-16 | 一种iOS APP字符串资源文件翻译方法及系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113961300A true CN113961300A (zh) | 2022-01-21 |
Family
ID=79473324
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111537027.0A Pending CN113961300A (zh) | 2021-12-16 | 2021-12-16 | 一种iOS APP字符串资源文件翻译方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113961300A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116522966A (zh) * | 2023-06-30 | 2023-08-01 | 天津华来科技股份有限公司 | 基于多语言词条的文本翻译方法及系统 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1282914A (zh) * | 1999-07-28 | 2001-02-07 | 国际商业机器公司 | 采用外观类进行软件翻译的内观编辑器系统、程序和方法 |
CN1364260A (zh) * | 1999-07-28 | 2002-08-14 | 国际商业机器公司 | 软件翻译的内省编辑器系统、程序和方法 |
US20040128614A1 (en) * | 2002-12-30 | 2004-07-01 | International Business Machines Corporation | Real time internationalization of web pages with embedded server-side code |
CN110333902A (zh) * | 2018-03-12 | 2019-10-15 | 杭州萤石软件有限公司 | 移动app的字符串加载方法、装置、系统及电子设备 |
CN110389807A (zh) * | 2019-07-23 | 2019-10-29 | 北京字节跳动网络技术有限公司 | 一种界面翻译方法、装置、电子设备及存储介质 |
CN111459602A (zh) * | 2020-05-21 | 2020-07-28 | 深圳万测试验设备有限公司 | 一种应用程序的多语言切换方法及装置、存储介质 |
CN113407288A (zh) * | 2021-06-29 | 2021-09-17 | 杭州海康威视数字技术股份有限公司 | 数据处理方法、装置及电子设备 |
-
2021
- 2021-12-16 CN CN202111537027.0A patent/CN113961300A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1282914A (zh) * | 1999-07-28 | 2001-02-07 | 国际商业机器公司 | 采用外观类进行软件翻译的内观编辑器系统、程序和方法 |
CN1364260A (zh) * | 1999-07-28 | 2002-08-14 | 国际商业机器公司 | 软件翻译的内省编辑器系统、程序和方法 |
US20040128614A1 (en) * | 2002-12-30 | 2004-07-01 | International Business Machines Corporation | Real time internationalization of web pages with embedded server-side code |
CN110333902A (zh) * | 2018-03-12 | 2019-10-15 | 杭州萤石软件有限公司 | 移动app的字符串加载方法、装置、系统及电子设备 |
CN110389807A (zh) * | 2019-07-23 | 2019-10-29 | 北京字节跳动网络技术有限公司 | 一种界面翻译方法、装置、电子设备及存储介质 |
CN111459602A (zh) * | 2020-05-21 | 2020-07-28 | 深圳万测试验设备有限公司 | 一种应用程序的多语言切换方法及装置、存储介质 |
CN113407288A (zh) * | 2021-06-29 | 2021-09-17 | 杭州海康威视数字技术股份有限公司 | 数据处理方法、装置及电子设备 |
Non-Patent Citations (1)
Title |
---|
刘一民: "《objective-C程序设计入门与实践》", 30 September 2013 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116522966A (zh) * | 2023-06-30 | 2023-08-01 | 天津华来科技股份有限公司 | 基于多语言词条的文本翻译方法及系统 |
CN116522966B (zh) * | 2023-06-30 | 2023-09-15 | 天津华来科技股份有限公司 | 基于多语言词条的文本翻译方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11461111B2 (en) | Method for running applets, and electronic device | |
CN100447743C (zh) | 在无需修改源代码的情况下本地化java gui应用的系统和方法 | |
US8862456B2 (en) | System and method for automatic language translation for applications | |
US20070244691A1 (en) | Translation of user interface text strings | |
CN108762743B (zh) | 一种数据表操作代码生成方法及装置 | |
US20110179073A1 (en) | Method for Localizing Text in a Software Application | |
US20070073544A1 (en) | Localization of prompts | |
US8468494B2 (en) | In-line editor | |
CN111831384B (zh) | 语言切换方法和装置、设备及存储介质 | |
JP2003186733A (ja) | 効率的なWebページのローカライズ | |
JP2001125794A (ja) | メッセージカタログ作成方法 | |
CN102103493A (zh) | 一种软件语言国际化的方法 | |
CN112235311B (zh) | Ovsdb客户端代码自动生成方法、系统、设备及介质 | |
WO2022033229A1 (zh) | 一种软件代码编译方法及系统 | |
CN112306620B (zh) | 自定义表单控件的多语言加载方法及装置 | |
US10474482B2 (en) | Software application dynamic linguistic translation system and methods | |
CN111729313A (zh) | 语言的配置方法及装置、存储介质、电子装置 | |
CN115408088A (zh) | 一种软件系统语言国际化全流程自动化方法 | |
CN113961300A (zh) | 一种iOS APP字符串资源文件翻译方法及系统 | |
US20030200535A1 (en) | System for program source code conversion | |
CN106873989A (zh) | 应用程序构造方法和装置 | |
CN114089980A (zh) | 编程处理方法、装置、解释器及非易失性存储介质 | |
CN111443979B (zh) | 文档处理方法、装置、计算机设备及存储介质 | |
CN111209757B (zh) | 一种基于语言包实现继电保护装置多语言版本方法及装置 | |
CN115618887B (zh) | 动态长文本国际化方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20220121 |