Tag: 本地化

TED 3.0:有效使用旧版iOS代码

我不会经常谈论我为保持家中照明效果所做的工作,但是过去四年来,我花了很大一部分时间在TED for iOS应用程序上工作。 就发布的范围和更改量而言,3.0版本是我们在TED上进行的最大发布。 字幕功能是该应用程序现已以20种新语言本地化。 现在,全世界的用户都可以使用其母语从阿拉伯语到土耳其语来体验TED。 在后台,我们计划将应用程序本地化超过一年。 花了这么长时间? 历史课 适用于iOS的TED于2010年10月首次登陆App Store,并专门针对原始iPad发行。 TED for iOS 1.0旨在在iOS 3.2上运行。 在过去的六年中,随着苹果平台设备和功能的变化,我们一直在此基础上不断发展。 在TED期间(2012年9月至今),我看到了: 视网膜图形,3x图形以及最终的矢量。 AVFoundation使我们轻松制作自己的自定义视频播放器(这是我的第一个TED项目!)。 引入ARC替代了手动保留/释放。 XCTest替代OCTest。 更大或更小的设备,例如iPad mini,iPad Pro,iPhone 5,iPhone 6和iPhone 6 Plus。 Auto Layout和size类可为管理所有这些新设备尺寸带来一些理智。 小部件和自定义共享操作之类的应用程序扩展。 哦,还有个叫Swift的小东西。 TED于2010年交付时,它完全是用Objective-C编写的,旨在在两种设备尺寸上工作:iPhone 3GS和原始iPad。 现在,我们支持从iPhone 4s到12.9“ iPad Pro等iPad的手机。在整个过程中,我们一直在更新相同的应用程序代码库。从未对iOS项目进行过全面的重写,有时可能很诱人。 装修您居住的房子 去年年初,我接任TED的首席开发人员,开始为TED投入更多的时间(TED一直最多是2个兼职开发人员,有时只有1个)。 这样一来,我们就可以将思维方式从维护现有应用程序以保持运转状态(偶尔添加功能)转变为尝试对移动目标更加雄心勃勃。 唯一的问题是我们的许多代码都在显示其年龄。 我列出了高水平的目标,以小规模的方式对应用进行现代化升级,以便我们仍然可以继续发布更新以使TED HQ开心,同时我消除了许多使我彻夜难眠的事情。 这些项目的第一个是对应用程序进行模块化。 由于我们的团队很小,并且有一群相当敬业的用户,他们可以快速升级,因此我们比大多数公司更快地使用最新版本的iOS SDK。 我将最低SDK设置为iOS 8,并开始将应用分解为单独的组件。 我们将其分为单独的动态框架,而不是其中包含所有代码的单个Xcode项目: TED:主要的iOS应用 TEDData:与数据层和业务逻辑相关的类 TEDVideo:我们的自定义视频播放器 TEDCore:在所有不同框架之间使用的共享代码 […]

应用程序本地化的注意事项–应用程序演示视频–中

应用程序本地化的注意事项 应用程式本地化的重要性 全球化使几乎任何人都可以在世界各地开展业务。 互联网,智能手机和其他技术为小型企业提供了进入国外市场的机会。 应用开发人员潜在地有数百万新的潜在客户来向他们的产品推销。 但是,当您进入一个新市场时,在处理文化上会有所不同,更不用说使您的产品适应新的语言了。 为了在这些新市场中取得成功,至关重要的是您必须针对其新环境正确地定位应用程序。 在本地化应用程序时不要犯这些常见的错误 应用程式开发人员将其行动应用程式影片示范带入国外市场时,常会犯以下10个常见错误: 直接嵌入到代码中的文本:将文本直接嵌入到代码中会减慢本地化过程,因为翻译人员需要实际阅读代码才能确定需要翻译的内容和不需要翻译的内容。 没有为字符串的增长和收缩腾出空间 :翻译的长度和密度可能会并且会有所不同。 如果您不为此做准备并且没有足够的空间,则字符串可能会与其他控件重叠,这需要在翻译后编辑界面。 提供语言但不提供语言环境 :有时国家/ 地区使用一种语言,但会有细微的差异。 英国的英语和美国的英语只是一个例子。 级联字符串 :使用占位符将句子片段串联在一起,其中单词和短语的顺序是硬编码的,假定语法和特定的句子结构。 条件文本的粒度可能会在翻译过程中引起混乱。 不使用Unicode进行字符编码 :每当您使用错误的字符编码并且源代码使用无法处理Unicode的数据类型处理字符串时,翻译都会中断。 通常,编程语言使用系统的默认编码存储文件和应用程序目录。 但是,如果您的服务器是英语,并且所有用户都使用中文浏览,则字符将被损坏。 硬编码数字,日期和时间单位 :世界各地的时间和日期格式差异很大。 度量单位也有所不同,例如英里和公里。 在大多数国家,货币也有所不同。 所有这些都会在翻译过程中造成麻烦。 不计划从右向左阅读的语言 :某些语言(例如阿拉伯语和希伯来语)从右向左阅读。 如果您不打算这样做,则可能最终不得不构建一组新的样式表。 由于缺少上下文而造成的混淆/歧义 :当字符串包含变量,在特定上下文中使用或措词不明确时,翻译人员将很难。 通常,翻译人员以上下文无关的格式处理文件和字符串。 那么,翻译人员将如何知道单个术语“联系”是按钮的动词还是标签的名词? 使用包含文本的图像:有时包含文本的图像对于翻译人员可能是个问题。 图片中的文字可能会减慢翻译过程,并可能导致翻译费用更高。 在其操作环境中未对翻译内容进行语言审查 。 语言审查是一项质量保证步骤,可确保没有不清晰的语言可能会引起用户的混淆或误解。 应用翻译的一些技巧 您可以采取许多措施来简化和廉价地翻译应用程序。 请记住以下10条提示,这些有助于提高翻译质量: 从代码中分离出诸如UI字符串和图像之类的资源 :设计应用程序以使资源与代码分离,使它们能够独立维护和本地化 隔离可本地化的资源文件 :需要本地化的文件(例如包含要翻译的文本的图像)也应该被隔离,并放置在标有语言名称的文件夹中。 设置您的默认语言,并标记所有资源 :始终在应用清单中为您的应用正确设置默认语言。 默认语言确定当用户不说任何受支持的语言时使用的语言。 用使用的语言标记默认语言资源,以便系统能够分辨资源所用的语言。 确定需要本地化的所有应用程序资源 :确定进入新市场时需要更改的所有内容。 检查图像,看它们是否适合文化。 […]

InAppTranslation-分析和用户反馈

使用分析发现下一个市场 下面的Google Analytics(分析)信息中心显示了针对应用开发者的有趣数据。 红色圆圈 -具有部分翻译的国家因此需要完成翻译,以免混淆用户。 蓝色圆圈 -拥有用户但不支持本地化的国家/地区。 这是您的下一个目标! 绿色圆圈 -支持拥有用户和本地化的国家。 检查DAU和MAU以查看它们是否对当前翻译满意。 圆的半径指定活动用户的大小。 如果将鼠标悬停在每个圆圈上,则可以看到DAU(每日活动用户)和MAU(每月活动用户)。 仪表板上的蓝色大球表示潜在的市场,因为您的应用程序中不支持其母语的用户已经存在。 提供他们的本地语言支持应该使他们感到高兴,您可以在这些国家迅速成长。 通过AppStore评分和用户反馈检查翻译质量 Analytics(分析)资讯主页中的其他重要指标是App Store评分和用户反馈。 App Store评分显示每种语言对应用程序的评分。 您需要从AppSettings页面在App Store中注册您的应用ID,才能启用此功能。 用户反馈选项卡显示来自用户的评分摘要。 (有关如何获得用户反馈的信息,请参见下一部分。) 这两个指标可帮助您检查当前本地化的质量。 如果您发现一种语言的收视率较低,则可以认为翻译质量不佳(因为该应用的功能较差,其他语言的收视率也很差。) 听到用户的声音 InAppTranslation具有用户反馈UI。 在您认为合适的地方(例如从“设置”页面)致电以下代码以征询用户的意见,该应用程序会显示一个简单的警报视图,要求用户对翻译质量进行投票。 如果用户在警报视图上单击“是”,则计数为正反馈;如果用户单击“否”,则显示如下视图,要求用户报告错误的翻译。 在此视图中,显示了日语翻译的列表以及原始的英语单词和短语。 用户可以选择自己不满意的翻译。 用户反馈选项卡显示更多详细信息。 您可以看到总体不良反馈率(“否”答案与“是”和“否”答案总数的比率)和每种翻译的不良反馈计数。 如果您发现某些翻译收集了不好的反馈,则可能需要重新翻译。

在Swift 3或ObjC中的Xcode 8中查找非NSLocalized字符串

本地化是一个过程,其中我们将所有要显示的字符串移动到一个位置,因此,如果有任何更改,例如,“确定”按钮现在将显示为“确定”,那么我们只需要在一个文件中进行更改。 此过程也可以是使应用程序支持多种语言的第一步,以便可以在运行时更改字符串的显示语言。 如果用户习惯(说)法语,则用户必须以法语查看所有内容。 为此,您应该维护一个字符串文件,其中包含代码库中的所有硬编码字符串。 众所周知,与许多开发人员同时工作会导致字符串处理不当,从而进一步导致代码库中本地化和非本地化字符串的混合使用。 假设有一个新要求,要求您的应用程序支持多种语言。 知道您的应用尚未准备好,因为我们从不关心字符串,这可能是您最大的噩梦。 下一步将是什么? 您可能希望尽快了解未本地化的字符串,因此可以计划对其进行本地化。 在代码库中搜索NSLocalizedString并比较.strings文件中的每个字符串是您唯一的选择吗? 好吧,Xcode提供了一种简洁而非常简单的方法来实现这一目标,而只需更改Xcode中的模式设置就可以实现。 #warning:如果您从未对任何字符串进行NSLocalization,则必须首先进行。 然后,担心将其保存在本地化(.string)文件中。 请注意,此解决方案适用于以下代码: label.text = NSLocalizedString(“某些字符串”,注释:“”) 要么 label.text = NSLocalizedString(anyVariableName,评论:“”) 不是这个 : label.text =“某个字符串” 这是您的架构的样子: 您可以按照以下步骤操作: 在“运行目标”菜单中单击目标,然后选择“编辑方案”。 在右侧,选择选项。 选中“显示未本地化的字符串”复选框。 单击关闭按钮。 单击运行以此模式启动您的应用程序。 或者, 添加NSShowNonLocalizedStrings启动参数。 在“运行目标”菜单中单击目标,然后选择“编辑方案”。 在右侧,选择参数 在“启动时传递的参数”中添加“ -NSShowNonLocalizedStrings YES ”。 单击关闭按钮。 单击运行以此模式启动您的应用程序。 它是如何工作的: 在Xcode中启用此设置, 在运行时搜索NSLocalizedString。 在字符串文件中查找键的相应条目。 如果找不到任何匹配项,它将在UI上以大写形式显示文本,并在控制台上显示错误消息。 将显示这种错误: 在捆绑包CFBundle的字符串表“ Localizable”中找不到可本地化的字符串“ Key”

快速指南:iOS国际化(i18n)和本地化(l10n)

您是否在开发iOS应用程序,但不知道如何国际化和本地化iOS应用程序? 如果答案是肯定的,那么您来对地方了。 在本文中,我们将介绍如何使用Swift在iOS应用程序中设置国际化(i18n)和本地化(l10n)。 苹果的移动操作系统iOS在过去几年中经历了非凡的全球增长,以至于苹果表示,现在有150多个国家/地区可以使用iOS App Store,并且iOS设备支持40多种语言。 国际化(i18n)是使您的应用适应不同语言和文化的过程。 另一方面,iOS中的本地化(l10n)是将您的应用翻译成针对特定语言环境的多种不同语言的过程。 注意»通常,开发人员(尤其是iOS开发人员)可以互换使用这两个术语(国际化和本地化),但实际上,两者是不同但相互联系的概念。 因此,我们将这篇基于教程的文章分为两个小节: iOS中的国际化 iOS中的本地化 你知道吗? »国际化和本地化通常分别缩写为i18n和l10n。 i18n中的18表示国际化的“ i”和“ n”之间的字符数,而10n中的10表示本地化的“ l”和“ n”之间的字符数。 花哨的东西,不是吗? 在深入讨论上述小节之前,让我们首先了解一些必需的步骤。 初赛 在本节中,我们将熟悉在iOS应用程序中执行i18n和l10n所需的步骤。 工具 您将需要以下工具: Xcode(最新版本)。 现在,我正在使用Xcode 9。 编程语言(iOS) 我们将使用以下语言进行编程: 迅速 决定 在实际进行国际化和本地化之前,您需要首先确定要定位的区域(地区)以及这些区域使用的语言。 初步步骤对于定位您的受众群体至关重要。 在本文中,我将使用英语作为基本语言,使用法语,中文(繁体)和德语作为其他本地化语言。 您可以根据需要和目标受众在应用程序中添加任意数量的语言。 添加其他语言的步骤将完全相同。 要知道的术语»地区或国家被称为地区,尤其是当我们处理国际化和本地化时。 无论您在何处找到“区域设置”,都仅表示某个国家或地区。 书呆子术语,不是吗? 既然我们已经讨论了这些基础知识,那么现在该深入了解前面提到的小节了。 iOS中的国际化(i18n) 正如我之前提到的,i18n是使您的应用适应不同语言环境的过程。 从iOS开发人员的角度来看,这是使字符串在外部可编辑的过程-无论是在情节提要中还是在代码中。 此外,为了根据各自​​的区域设置日期,数字等,您必须使用不同的内置类。 例如,我们可以使用“格式”类根据区域设置日期格式,根据首选语言设置数字格式等等。 现在,我们将使用简单的设置来适应国际化过程。 建议»在完成应用程序的设计和编码部分后,请务必执行国际化和本地化步骤。 为什么? 因为Xcode会通过在可本地化的文件中自动添加字符串来节省您的大部分时间。 如果在编写应用程序代码之前执行这些步骤,则必须手动将所有字符串添加到其指定文件中(用于本地化)。 最重要的是,您应该在最后完成国际化的所有步骤。 您(iOS开发人员)需要执行以下步骤才能国际化您的应用程序: 为i18n设置项目 创建新项目或拥有要国际化的现有应用程序后,请确保在Xcode的项目信息设置(如下所示)中选中了名为“ […]

为iOS应用程序带来动态本地化– Vincent Pradeilles –中

可以在我的 GitHub上找到 一个演示本文内容的演示项目 。 对于用户而言,能够与使用他能理解的语言本地化的应用进行交互具有极其重要的意义。 毫无疑问,iOS在为开发人员提供很少的成本方面提供了出色的性能。 不幸的是,它仅以静态方式提供,这意味着该应用是使用设备的语言环境进行本地化的,但是一旦用户进入应用内部,SDK便无法为我们提供动态更新本地化的方法。 这样的功能仍然可以带来巨大的商业价值。 例如,让我们以一个推销员为例,该推销员使用iOS应用程序在展览会上向潜在客户展示其产品。 并非他遇到的所有人都会说相同的语言,因此能够即时切换其应用的本地化将是一个很好的帮助。 在本文中,我将向您展示如何利用Objective-C运行时的特性来实现此目标,而无需创建新的本地化API。 iOS如何处理本地化? 在iOS应用中, Localizable.strings文件被视为资源,因此使用Bundle类进行存储和访问。 为了更好地了解手头的结构,我们可以检查应用程序的内容: 我们看到,对于每个本地化,都有一个对应的.lproj目录,其中包含本地化的资源。 因此,我们实现动态本地化的策略将是找到一种方法来使应用程序在这些目录之间动态交换。 进入Objective-C运行时 从iOS 11开始,所有应用程序都使用Objective-C运行时运行,Objective-C运行时是一个托管Objective-C兼容类并允许它们按预期进行交互的环境。 对我们来说幸运的是,此运行时公开了一个API,该API允许我们的应用程序与其配合使用。 尽管需要谨慎使用,但它绝对拥有强大的力量。 让我们考虑一下这个函数: 结论 在本文中,我专注于可本地化的字符串,因为它是迄今为止在给定应用程序中最常见的一种本地化资源。 但是,我所描述的解决方案当然可以应用于任何本地化的资源,例如音频文件,视频等。

超级易故事板本地化

尽管我们现在使用的是iOS 11,但Storyboard的本地化仍然很难解决。 总的疼痛在亚述。 这是我在SmartShopper的iOS中想到的。 创建一个名为UILocalize.swift的文件(或您喜欢的任何名称)。 2.扩展要本地化的UI元素,通过IBInspectable添加LocalizedXxxx属性 例如,要向所有UIButton添加本地化标题支持,我们可以 扩展UIButton { @IBInspectable var localizedTitle:字符串? { 得到{ 返回nil //并不重要 } 设置{ 如果让newValue = newValue { self.setTitle(NSLocalizedString(newValue,comment:“”),用于:.normal) } } } } 3.返回UI Builder,所有按钮现在都具有一个名为Localized Title的新属性。 4.现在,我只需要将其添加到我的Localizable.string文件中,例如 “ ADD_TO_FAVOURITES_CAPS” =“ SIMPAN KE SENARAI KEGEMARAN”; 5.现在,当您使用英语以外的其他语言运行应用程序时,您应该获得翻译后的文字!

iOS本地化正确! SwiftGen巴蒂·克鲁奇

本地化是一个广泛的话题,很多时候所要做的不仅仅是将单词翻译成预期的语言。 雷·温德利希(Ray Wenderlich)在他的博客上有很多与此相关的文章。 苹果公司已经就该主题制作了多个WWDC视频。 这是一个在网络上覆盖面很广的主题,那么另一篇文章的重点是什么? 我将与大家分享一些技巧和库,这些技巧和库可以在两个常见问题上为您提供很多帮助: 保持情节提要的.strings文件同步 使用枚举而不是使用NSLocalizedString宏处理本地化 这篇文章从您已经在项目中配置了本地化的地方继续进行,包括字符串和情节提要。 如果不是这种情况,您可以在Ray Wenderlich的帖子中找到所需要做的一切。 SwiftGen比NSLocalizedString更好 SwiftGen是一个神奇的宝石,它为我们的iOS管道带来了很多自动化,它可以帮助您生成一个故事板,字符串等枚举。 您可以在github页面上找到一些用例和更多信息。 AliSoftware / SwiftGen SwiftGen –用于生成Swift代码的Swift工具集合(用于您的资产的枚举,情节提要,Localizable.strings… github.com 脚步: 首先,我们需要安装swiftgen,我们可以通过自制软件完成 $ brew更新 $ brew install swiftgen 2.在此之后,我们只需要向项目的“构建”阶段添加一个新的运行脚本阶段 代码很简单,在上面的屏幕快照中,我同时生成了情节提要和字符串枚举 $ PODS_ROOT / SwiftGen / bin / swiftgen故事板-t swift3 $ SOURCE_ROOT —输出$ SOURCE_ROOT / {STORYBOARD_ENUM_OUTPUT_PATH} /Storyboard.swift — sceneEnumName故事板 $ PODS_ROOT / SwiftGen / bin / […]

不论电话语言如何,如何在iOS应用程序内部进行本地化

最近,当我们与我的团队为一个iOS应用程序开发项目的完成感到高兴时,一封电子邮件入侵了我的屏幕。 我们从刚刚完成项目的同一客户那里收到了新要求。 邮件中写道:“我希望我们的应用程序应从应用程序内部更改其语言,而与电话语言无关”。 你们遇到过这个问题吗? 好吧,你可能有! 因此,我想到写这个博客来分享我如何解决此问题的经验。 在这篇文章中,我想介绍以下几点: 什么是应用程序本地化? 本地化如何在iOS中工作? 为什么应该优先考虑iOS应用本地化? 如何在iOS应用中进行本地化? 为什么本地化很重要? 什么是应用程序本地化? 根据W3C(万维网的主要国际标准),应用程序本地化是指对您的应用程序进行调整,以满足目标市场( 语言环境 )的语言,文化和其他要求。 本地化通常写为l10n ,其中10是l和n之间的字母数。 本地化如何在iOS中工作? 启动iOS应用程序后,操作系统会努力将您喜欢的设备语言与应用程序支持的语言进行匹配或整理。 您的应用使用默认语言。 例如,英语和法语是您的应用程序支持的语言,在这种情况下,用户将英语设置为应用程序的默认语言。 因此,现在当用户的电话语言设置为法语时,您的应用将显示法语内容。 但是,当用户将电话语言更改为意大利语时,您的应用将加载默认的应用语言,在这种情况下为英语。 这是因为您的应用仅支持英语和法语,而没有意大利语本地化。 因此,在这种情况下,当电话语言设置为法语以外的其他任何语言时,您的应用将始终显示英语内容。 为什么要优先考虑iOS应用本地化? 多年来,iPhone在全球范围内的销售取得了巨大的增长。 让数字说明一切,请参见下图(由Statista提供)。 在上图中,您可以看到苹果iPhone从2007年第三季度到最近一个财务季度的全球销售情况。 苹果在2017财年售出2.176亿部iPhone ,2018年第二季度售出5222万部iPhone 。 尽管全球智能手机市场竞争激烈,但苹果的收入从2004年的80亿美元增长到2017年的超过2,290亿美元 。 归功于几乎所有国家/地区的iPhone成功。 现在,您可以期望您的下一个客户来自印度,中国,墨西哥,泰国或其他任何地方! 因此,正确制定iOS应用本地化策略可能会转化为更多应用下载。 如何在iOS应用中进行本地化? 当涉及到根据手机更改语言时,通常我们会获取手机语言代码并相应地加载“ lproj”文件。 但是在这种情况下,它必须是动态的,因此我创建了“ String”的扩展名。 看下面的代码: extensionString { publicvar localized:字符串{ ifletbundleName:String = UserDefaults.standard.value(forKey:“ USER_LANG”)如? 串 { let […]

我们如何本地化我们的应用程序

每个应用程序都需要本地化,即使它是小型“单一语言”应用程序也是如此。 您永远不知道何时可以添加另一种语言。 即使您完全确定应用程序中将不再有其他语言,出于多种原因,也不应该在代码中直接编写字符串。 因此,您可以创建一些自定义枚举,常量,也可以使用标准的默认本地化键。 猜猜有什么更好的。 😏 本地化不仅涉及字符串,而且日期,数字或货币也必须根据用户的语言环境进行本地化和格式化。 由于它是由iOS本身处理的,因此现在让我们谈谈字符串本地化。 紧随其后的文本不是任何普遍真理,也不建议您应如何去做。 这就是我们做到的方式。 您可以使用它,从中获得启发,但是当然它不一定适合每个人。 让我们将其分为2个级别。 第一个是在应用程序中的代码级本地化。 第二个是非程序员对字符串的管理和翻译。 在应用程序本身中,一切都很好。 在最低级别上,我们使用标准.strings格式以及一些其他工具,以使其更加舒适和防错(如下所述)。 但是问题是如何创建Localizable.strings ? 程序员定义了本地化密钥,并且有人必须创建翻译。 您可以将所有Localizable.strings文件发送到翻译器,但是对于非程序员来说,这是一种非常令人困惑的格式,并且文件以某种方式返回损坏的可能性也很大(被遗忘的分号,引号等)。 对,这个问题早已解决。 创建了很多服务,尤其是用于翻译应用程序的服务。 可能最著名的是PhraseApp,但是还有Smartling,transifex等。 所有这些服务有2个共同点。 只是个过分杀手-我们发现我们真的不需要像PhraseApp这样的野兽。 帐户,历史记录,图表和其他功能。 这非常昂贵-当然,我们不会破产,但是为什么要为我们不需要的东西付钱呢? 在开始使用类似“ 短语应用替代 ”之类的内容之前,请尝试一下其他方法。 我们都知道电子表格…具有实时协作的Google Excel,但是您可能会惊讶于Google Spreadsheet如此强大! 您可以使用Apps Script进行出色的工作,它具有良好的Web API,并且还有许多用于各种编程环境的开源库。 我们甚至已经使用电子表格作为小型应用程序的后端,但这是另一篇文章的主题。 因此,如果它可以代替后端,那么它应该能够处理少量本地化字符串。 我们创建了一个新的电子表格,其中包含用于每个应用程序的本地化键和支持的语言的列。 由于命名约定的不同,每个平台的键可能会有所不同,这就是我们拥有更多键列(例如key_ios , key_android )的原因。 例如,基本表如下所示: + ==================================== + =========== == + ========== + | key_ios | […]