阿拉伯语macOS适配笔记
阿拉伯语适配笔记
西语言特性:
亚洲西部的各个阿拉伯国家的语言都是从右往左,如:Arabic(阿拉伯),Urdu(乌尔都),Hebrew(希伯来),Farsi(波斯)泰语、印地语、泰米尔语或马拉雅拉姆语,当然也还我中国的古文字也是从右到左书写阅读的。
语言 | 文字/阅读/输入/排版方向 |
---|---|
西语 | 从右到左 |
非西语语言(中文、英文等) | 从左到右 |
适配方案:
-
对于系统的控件大部份都有 API 直接支持,只是默认是没有开启的,需要我们在代码进行开启适配;
-
但它必须满足以下条件:
-
必须使用 Autolayout 设置其约束:
目的:系统会自动将其相关约束依赖控件镜像排布;如下图:一个是用 autolayout设置约束一个是没设的;
注意:如果使用代码或者第三方库(SnapKit)设置约束,设置其左右约束时必须使用
leading or trailing
属性,不能使用left 、right
,否则系统不会自动镜像。 -
设置其控件的镜像属性:
在 xib 界面控件的属性面板找到:
Morror 设置成:In Right To Left Interface
,设置此属性时在这些特殊语言下控件自身才会自动镜像,如下Morror设置左图。 -
设置控件的文字排版方向,几个属性的关系及影响:
- Text Direction (baseWritingDirection):文字书写方向
- Alignment (alignment):文字对齐方式
- Layout Direction (userInterfaceLayoutDirection): UI控件的排版方向
- Mirror:控件镜像
属性优先级:
Autolayout
:Mirror
>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设置 有约束与没有约束对比 -
涉及到的UI控件:
这里以几个常用UI 控制为例:
- Label:设置其 Alignment 、Text Direction 来控制文字排布方向;
- Image:设置其 Alignment、Text Direction 来控制文字排布方向;
- textfield:设置其 Alignment、Text Direction 来控制文字排布方向,使用 Layout Direction 切换其布局方向;
- Switch、CheckBox(选择框类):使用 Layout Direction 切换其布局方向;
- Slider:使用 Layout Direction 切换其布局方向;
- Progress:使用 Layout Direction 切换其布局方向;
- TableView、CollectionView、OutlineView:使用 Layout Direction 切换其布局方向;
- SplitView:使用 Autolayout 布局会自动切换左右分屏视图的位置;
- Window:系统的关闭/最小化/最大化按钮,你语言设置为西语并重启后会自动从左移动右边,详细下章节有说明。
- WebView:使用 Layout Direction 切换其布局方向;
- 如果控件的文字中包含西语和非西语,则可以在文本最前面加如下字符:
\u202B
表示RTL,此情况下,系统会当作西语进行排版(右到左)\u202A
表示LTR,此情况下,系统会当作非西语进行排版(左到右)
注意:所有控件须使用 Autolayout 布局会自动切换左右排布的位置,如果不使用Autolayout,则需要自己在代码额外进行计算在西语下的布局
开发阶段语言切换的几种方法
-
Xcode 中直接切换:
Edit Scheme -> Options -> App Language
-
系统设置中给特定 App 指定语言:
System Preferences -> Language & Region -> Apps -> 点击加号找到Arabic
-
系统设置中全局切换语言:
System Preferences -> Language & Region -> General -> 点击加号找到Arabic -> 拖到最前面
注意点:不管那种方式,在系统语言不是阿拉伯语言的情下,App 的系统级控件的排版不会变成阿拉伯语言的方式排版,必须在更改为阿拉伯语言后并重启电脑,如:系统的关闭、最小化、最大化按钮及系统状态栏、Dock 栏;文字会变,所以为要准确的适配它,在开发完成后一定要把电脑切换阿拉伯语言,并重启后再确认下自己写的 UI。
目前已适配可以使用的控件:
- Window 已统一适配,所有新建的 NSWindow 直接继承至
FMWindow
,就会自动适配系统级默认的控件,eg.:关闭按钮,最小最大化的状态变化; - 所有继承自
NSControl
的子类控件,直接调用:func autoLayoutDirectionWhenInternationalizing()
函数会自动适配文字的排版方向。eg.: 输入框、文本框、进度条、选择框、按钮等; - 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。
出处:http://www.cnblogs.com/nenhall/
如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!
版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。