阿拉伯语macOS适配笔记

阿拉伯语适配笔记

西语言特性:

亚洲西部的各个阿拉伯国家的语言都是从右往左,如:Arabic(阿拉伯),Urdu(乌尔都),Hebrew(希伯来),Farsi(波斯)泰语、印地语、泰米尔语或马拉雅拉姆语,当然也还我中国的古文字也是从右到左书写阅读的。

语言 文字/阅读/输入/排版方向
西语 从右到左
非西语语言(中文、英文等) 从左到右

适配方案:

  1. 对于系统的控件大部份都有 API 直接支持,只是默认是没有开启的,需要我们在代码进行开启适配;

  2. 但它必须满足以下条件:

    1. 必须使用 Autolayout 设置其约束:

      目的:系统会自动将其相关约束依赖控件镜像排布;如下图:一个是用 autolayout设置约束一个是没设的;

      注意:如果使用代码或者第三方库(SnapKit)设置约束,设置其左右约束时必须使用leading or trailing 属性,不能使用 left 、right,否则系统不会自动镜像。

    2. 设置其控件的镜像属性:

      在 xib 界面控件的属性面板找到:Morror 设置成:In Right To Left Interface,设置此属性时在这些特殊语言下控件自身才会自动镜像,如下Morror设置左图。

    3. 设置控件的文字排版方向,几个属性的关系及影响:

      • Text Direction (baseWritingDirection):文字书写方向
      • Alignment (alignment):文字对齐方式
      • Layout Direction (userInterfaceLayoutDirection): UI控件的排版方向
      • Mirror:控件镜像

      属性优先级: AutolayoutMirror > Alignment > Text Direction

      • 如果Mirror非 Automatically,以Mirror为准,忽略后面低优先级属性
      • 如果Mirror是Automatically,则以Alignment为准,忽略后面低优先级属性
      • 如果Mirror是Automatically且Alignment为natural,则以Text Direction为准

      结论:需要适配西语时,文体类控件需要将其 Alignment设置为natural,系统默认是natural

      @available(macOS 10.0, *)
      public enum NSTextAlignment : Int {
          case left = 0 // Visually left aligned
          case right = 1 // Visually right aligned
          case center = 2 // Visually centered
          case justified = 3 // Fully-justified. The last line in a paragraph is natural-aligned.
          case natural = 4 // Indicates the default alignment for script
      }
      
      @available(macOS 10.0, *)
      public enum NSWritingDirection : Int {
          case natural = -1 // Determines direction using the Unicode Bidi Algorithm rules P2 and P3
          case leftToRight = 0 // Left to right writing direction
          case rightToLeft = 1 // Right to left writing direction
      }
      
      @available(macOS 10.8, *)
      public enum NSUserInterfaceLayoutDirection : Int {
          case leftToRight = 0
          case rightToLeft = 1
      }
      
    Morror设置 有约束与没有约束对比
    Morror设置

涉及到的UI控件:

这里以几个常用UI 控制为例:

  1. Label:设置其 Alignment 、Text Direction 来控制文字排布方向;
  2. Image:设置其 Alignment、Text Direction 来控制文字排布方向;
  3. textfield:设置其 Alignment、Text Direction 来控制文字排布方向,使用 Layout Direction 切换其布局方向;
  4. Switch、CheckBox(选择框类):使用 Layout Direction 切换其布局方向;
  5. Slider:使用 Layout Direction 切换其布局方向;
  6. Progress:使用 Layout Direction 切换其布局方向;
  7. TableView、CollectionView、OutlineView:使用 Layout Direction 切换其布局方向;
  8. SplitView:使用 Autolayout 布局会自动切换左右分屏视图的位置;
  9. Window:系统的关闭/最小化/最大化按钮,你语言设置为西语并重启后会自动从左移动右边,详细下章节有说明。
  10. WebView:使用 Layout Direction 切换其布局方向;
  11. 如果控件的文字中包含西语和非西语,则可以在文本最前面加如下字符:
    1. \u202B表示RTL,此情况下,系统会当作西语进行排版(右到左)
    2. \u202A表示LTR,此情况下,系统会当作非西语进行排版(左到右)

注意:所有控件须使用 Autolayout 布局会自动切换左右排布的位置,如果不使用Autolayout,则需要自己在代码额外进行计算在西语下的布局

开发阶段语言切换的几种方法

  1. Xcode 中直接切换:

    Edit Scheme -> Options -> App Language

  2. 系统设置中给特定 App 指定语言:

    System Preferences -> Language & Region -> Apps -> 点击加号找到Arabic

  3. 系统设置中全局切换语言:

    System Preferences -> Language & Region -> General -> 点击加号找到Arabic -> 拖到最前面

注意点:不管那种方式,在系统语言不是阿拉伯语言的情下,App 的系统级控件的排版不会变成阿拉伯语言的方式排版,必须在更改为阿拉伯语言后并重启电脑,如:系统的关闭、最小化、最大化按钮及系统状态栏、Dock 栏;文字会变,所以为要准确的适配它,在开发完成后一定要把电脑切换阿拉伯语言,并重启后再确认下自己写的 UI。

目前已适配可以使用的控件:

  1. Window 已统一适配,所有新建的 NSWindow 直接继承至FMWindow,就会自动适配系统级默认的控件,eg.:关闭按钮,最小最大化的状态变化;
  2. 所有继承自NSControl的子类控件,直接调用:func autoLayoutDirectionWhenInternationalizing()函数会自动适配文字的排版方向。eg.: 输入框、文本框、进度条、选择框、按钮等;
  3. NSSplitView 不需要在代理方法中设置左右或者上下分屏视图的最大/最小宽度或者高度,直接使用 Autolayout 分别设置其Custom View的最大/最小宽度或者高度,约束设置时注意必须设置为大于或等于某值,并把优先级设置为750;

最终效果参考:

如下两张图是按上面所讲的方式+封装好的方法进行开发出来的效果;

基本不涉及到布局的额外计算,但目前封好的主要针对系统原生的控件,针对项目完全自己定义的控件,可能还需要额外的进行一些布局计算

左到右 右到右
![image-20201013205958807](/Users/ws/Library/Application Support/typora-user-images/image-20201013205958807.png)
属性 含义
top 顶部
bottom 底部
leading (left) 左边:代表左边公限于当前语言中文字的阅读顺序,习惯从左到右,从右到左阅读语言中表示右边
trailing (right) 右边:代表右边公限于当前语言中文字的阅读顺序,习惯从左到右,从右到左阅读语言中表示左边
width
height
center X 水平方向的中心
center Y 垂直方向的中心
baseline 文字的基线位置:只用在Text 广西相关控件,用来确定文字底部位置

IntrinsicContentSize:对于文本/图片等一些视图控件,可以通过其内在的内容推算出控件的大小,但并不是所有的控件都有这个属性。Button、Label、TextField、TextView、ImageView都可以根据内在的内容计算控件的大小。

基本控件的内容,有两个特定的约束,即内容收缩(content hugging)约束和内容扩张(content compression)约束,这两个约束简称CHCR。

posted @ 2021-03-30 09:54  nenhall/浩哥哥  阅读(626)  评论(0编辑  收藏  举报