阿拉伯语作为iOS应用程序的默认语言

有时您想制作一个仅使用阿拉伯语的应用程序。 或者,您可能需要支持某些语言,但是您希望阿拉伯语成为默认的应用程序语言。 在这里,我们看到它是如何完成的,因为要弄清楚它并不直观。

您可能会完全按照设计指南的建议,直接在Xcode的Interface Builder中布局视图。 例如,如果您的设计如下图所示,则可以决定将按钮放在开头,将文本字段放在结尾。

这种方法的问题在于,iOS将认为这是您希望应用在从左到右模式下的外观。 也就是说,默认情况下,导航栏stil中的后退按钮将位于左侧,与导航控制器的后向滑动手势并排。

因此,更好的选择是像将项目本地化一样实施它。 也就是说,将文本字段放在最前面,将按钮放在最下面。 但是您可能会问,什么会颠覆我们的看法以给我们我们所期望的结果?

  1. 打开项目的info.plist作为源代码(右键单击->作为源代码打开)。
  2. 寻找CFBundleDevelopmentRegion 。 您可能会发现它类似于$(DEVELOPMENT_LANGUAGE) 。 将其更改为ar

而已。 运行您的项目并享受您的翻转界面。

但是,我不喜欢这种方法。 因为这可能会使您的项目有些荒谬的项目配置。 我的意思是,如果您打开项目设置(而非目标设置),则会在“本地化”部分中找到以下配置:

它说英语是开发语言,但实际上并非如此。 尽管可以删除它并添加阿拉伯语,但您不会将它的“ - Development Language部分放在前面。 同样,Xcode会为您的故事板生成您可能不需要的阿拉伯语本地化文件。

我比较喜欢以下方法,尽管有点笨拙。

脚步:

  1. 导航到您的project.xcodeproj
  2. 右键单击并选择“显示包装内容”。
  3. 使用文本编辑器打开project.pbxproj
  4. + F并寻找单词region 。 您应该找到两个匹配项developmentRegionknownRegions 。 如下图所示,将en的值更改为ar

而已。 您将阿拉伯语作为开发语言。

您的应用已本地化。 您支持多种语言。 但是,您希望应用程序的首次运行使用阿拉伯语,然后用户可以更改它。 该怎么办?

在开始之前,最好先了解iOS如何为我们的应用选择正确的语言。 在此官方问答中对此进行了解释,但我将在此进行总结。

iOS在用户的语言首选项列表中选择第一种语言(在“ Settings应用程序的Settings General >“ Language & Region Settings )。 然后在您的项目中查找匹配的.lproj文件夹。 此类文件夹包含本地化资源(例如,情节提要)的相关.strings文件。 您支持的每种语言都有一个带有语言前缀的.lproj文件夹,例如ar.lprojen.lproj等等。 因此,在应用启动时,iOS选择它认为正确的本地化,并且不会将您(开发人员)用于此类决策

那是针对支持用户语言首选项列表中的语言的应用程序。 如果用户的语言首选项列表与您的应用程序中的任何.lproj文件夹都不匹配,则iOS使用CFBundleDevelopmentRegion 。 这基本上就是上面方案1中的工作方式。

因此,我们的任务是绕过首选项列表检查。 幸运的是,iOS似乎在每个应用程序的用户默认设置中存储了此类首选项列表的副本。 因此,如果您希望tp在运行时检索它,可以这样查询:

  NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];  NSArray *语言= [defs objectForKey:@“ AppleLanguages”];  NSString * preferredLang = [languages objectAtIndex:0];  NSLog(@“当前语言为%@”,preferredLang); 

这是本地化Apple样本中的代码片段。

幸运的是,该用户默认的条目是可写的。 因此,我们可以用我们自己的偏好列表之一替换该偏好列表。 语言标识符的数组(其中阿拉伯语是第一个)足以使阿拉伯语成为默认值,例如["ar"]

到目前为止,一切都很好。 现在剩下的问题是在哪里设置新数组?

application:didFinishLaunchingWithOptions:还不及早设置此类密钥。 任何iOS应用程序的真正起点都是一个名为main的函数。 Swift iOS开发人员可能不知道,但是对于使用Objective-C的人来说是众所周知的。

在Objective-C项目中,您可以在名为main.m的文件中轻松找到它。 看起来像这样:

目标C:

  #import  
#import“ AppDelegate.h” int main(int argc,char * argv []){
@autoreleasepool {
返回UIApplicationMain(
argc,
argv,
零,
NSStringFromClass([AppDelegate类])
);
}
}

在Swift项目中,这有点奇怪。 如使用Swift进行黑客@UIApplicationMain所述,您需要从AppDelegate类中删除@UIApplicationMain ,然后添加一个名为main.swift的文件。 为了我们的目的, main.swift文件将如下所示:

 类MyApplication:UIApplication { 
覆盖init(){
让notFirstOpenKey =“ notFirstOpen”
让notFirstOpen = UserDefaults.standard.bool(forKey:notFirstOpenKey)
如果不是FirstOpen == false {
UserDefaults.standard.set([[“ ar”],forKey:“ AppleLanguages”)
UserDefaults.standard.set(true,forKey:notFirstOpenKey)
}
super.init()
}
} UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(
到:UnsafeMutablePointer .self,
容量:Int(CommandLine.argc)
),
NSStringFromClass(MyApplication.self),
NSStringFromClass(AppDelegate.self)

底部UIApplicationMain在上面的“用Swift黑客”一文中进行了解释。 与我们相关的是MyApplication子类的实现。

您可能已经了解了, MyApplication是我们的UIApplication自定义类实现。 因此,它的init方法可以看作是我们应用程序的开始。 应用生命周期的最初几毫秒。 在这里,我们可以设置AppleLanguages键,并利用其效果。

在上面的代码片段中,我另外进行了检查,看看是否之前已经完成此操作。 避免不必要的重复。

而已。 大功告成 终于结束了。

更改默认开发语言


最初于 2018 年8月10日 发布在 ahmedk92.github.io