App的國際化和本地化(六) —— 支持從右到左的語言(一)

版本記錄

版本號 時間
V1.0 2018.05.11

前言

很多APP都有國際化版本,常見于一些大公司的產(chǎn)品,比如Facebook、Wechat等,那么國際化需要我們APP做哪些更改呢,接下來這幾篇就一起來看一下APP的國際化和本地化。感興趣的可以看上面幾篇。
1. App的國際化和本地化(一) —— 簡單介紹(一)
2. App的國際化和本地化(二) —— 查看語言和區(qū)域設(shè)置(一)
3. App的國際化和本地化(三) —— 國際化用戶界面(一)
4. App的國際化和本地化(四) —— 國際化代碼(一)
5. App的國際化和本地化(五) —— 使用區(qū)域設(shè)置格式化數(shù)據(jù)(一)

回顧

上一篇主要介紹區(qū)域設(shè)置格式化數(shù)據(jù),本篇主要介紹支持從右到左的語言。


Supporting Right-to-Left Languages - 支持從右向左語言

顯示從右向左語言時,應(yīng)該鏡像您的用戶界面。 如果您使用基本國際化和自動布局,大部分用戶界面將自動為您呈現(xiàn)鏡像。 文本方向從右到左改變,電話號碼和國家代碼總是從左到右。 用戶界面中的某些視圖和控件可能不會自動更改方向; 在適當?shù)臅r候,你可以通過編程來解決這個問題。


Creating Right-to-Left User Interfaces - 創(chuàng)建從右向左的用戶界面

Internationalizing the User Interface中所述,通過使用基本國際化和自動布局來支持從右到左的語言。 一般來說,如果開發(fā)語言是從左到右,請將視圖從左上角開始對齊,并添加將視圖展開到右下角的約束。 當您使用自動布局的leading屬性和trailing屬性(不是右側(cè)屬性和左側(cè)屬性)時,大部分用戶界面都會以從右到左的語言進行鏡像。 對于Mac應(yīng)用程序,大多數(shù)控件(如分段控件,進度指示器和大綱視圖)也會出現(xiàn)翻轉(zhuǎn)。 在iOS應(yīng)用程序中,UIKit控件在應(yīng)用程序鏈接到iOS 9及更高版本時出現(xiàn)翻轉(zhuǎn)。

不應(yīng)該以從右到左的語言翻轉(zhuǎn)的控件類型和內(nèi)容是:

  • 視頻控制和時間線指示器
  • 圖像,除非他們傳達方向感,如箭頭
  • 音樂筆記和樂譜
  • 圖形(x和y軸總是以相同的方向出現(xiàn))

使用base internationalization,并根據(jù)需要為您支持的從右向左語言提供特定于語言的圖像和音頻文件。 要本地化其他資源文件,請閱讀Adding Additional Resources You Want to Localize。

按照Testing Right-to-Left Layouts中的描述,以從右到左的語言徹底測試用戶界面,并且只有在必要時修改代碼以支持從右到左的語言


Getting the Layout Direction - 獲取布局方向

在iOS應(yīng)用程序中,通過調(diào)用userInterfaceLayoutDirectionForSemanticContentAttribute:方法獲取UIView實例的布局方向。 例如:

if ([UIView userInterfaceLayoutDirectionForSemanticContentAttribute:view.semanticContentAttribute] == UIUserInterfaceLayoutDirectionRightToLeft) {
    …
}

在Mac應(yīng)用程序中,通過檢查視圖的userInterfaceLayoutDirection屬性來獲取NSView實例的布局方向。 例如:

if (view.userInterfaceLayoutDirection == NSUserInterfaceLayoutDirectionRightToLeft) {
...
}

Setting Text Alignment - 設(shè)置文本對齊

默認情況下,iOS中的文本對齊是自然的; 在OS X中,它是左對齊。 在從左到右的語言中,使用自然文本對齊方式將文本左對齊,在從右向左的語言中,自動鏡像對齊方式。 例如,如果使用setAlignment:方法設(shè)置NSMutableParagraphStyle對象的對齊方式,請傳遞NSNaturalTextAlignment作為參數(shù)。

[[(NSMutableParagraphStyle *)paraStyle setAlignment:NSNaturalTextAlignment];

但是,如果在從左到右的語言中,將控件對齊到右側(cè)(右到左語言中的左側(cè))。請獲取布局方向,如Getting the Layout Direction中所述并設(shè)置 NSLeftTextAlignment的對齊方式為從右到左的語言。

對于Mac應(yīng)用程序:

if ([NSApp userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft) {
    [[(NSMutableParagraphStyle *)paraStyle setAlignment:NSLeftTextAlignment];
} else {
    [[(NSMutableParagraphStyle *)paraStyle setAlignment:NSRightTextAlignment];
}

Handling Bidirectional Text - 處理雙向文本

雙向(或“雙向”)文本是包含以不同方向運行的段的文本。 諸如阿拉伯語和希伯來語等語言是從右到左書寫的,但數(shù)字和拉丁文字(如非本地化產(chǎn)品名稱)是從左到右書寫的。 使用自動處理雙向文本的標準視圖和控件,如Displaying Text中所述。 如果您為文本輸入創(chuàng)建自定義控件,則需要自己處理雙向文本。

視頻:WWDC 2013 Making Your App World-Ready: International Text > Bidirectional Text

1. Using Natural Writing Direction - 使用自然寫作方向

對于文本和控件,請使用自然書寫方向,通過檢查要顯示的文本的前幾個字符來確定運行時的書寫方向。

對于iOS應(yīng)用程序,請在UITextInput協(xié)議中使用setBaseWritingDirection:forRange:方法,并傳遞UITextWritingDirectionNatural作為書寫方向參數(shù)。 對于Mac應(yīng)用程序,使用setBaseWritingDirection:方法設(shè)置控件和其他類型對象的基本書寫方向,并傳遞NSWritingDirectionNatural作為參數(shù)。

盡管方向和對齊方式是不同的設(shè)置,但左對齊語言中的文本左對齊并且右對齊語言中的文本右對齊很常見。 閱讀 Setting Text Alignment以了解如何設(shè)置從右到左語言的文本對齊方式。

2. Adding Unicode Markup to Bidirectional Text - 添加Unicode標記到雙向文本

在少數(shù)情況下,默認行為會產(chǎn)生不正確的結(jié)果。 為了處理這些情況,Unicode Bidirectional Algorithm提供了許多可以用來強制正確行為的不可見字符。

例如,電話號碼按照所有語言從左到右排列。 如果本地化的字符串包含電話號碼的變量,請在變量之后插入一個從左到右的嵌入(LRE)字符U + 202A,并在變量之后插入一個彈出方向格式(PDF)字符U + 202C。

// Wrap the plus (+) prefix and phone number in left-to-right directional markers
NSString *phoneNumber = @"408-555-1212";
NSString *localizedPhoneNumber = [NSString stringWithFormat:@"\u202A%@\u202C", phoneNumber];

相反,在從左到右的語言中,要始終以顯示從右到左的變量,請在變量和彈出方向格式(PDF)字符之前插入從右到左嵌入(RLE)字符U + 202B ,變量后插入U + 202C。

如果一個變量出現(xiàn)在字符串的開頭,則自然方向會導(dǎo)致整個字符串使用變量的方向性。 如果變量的方向性未知,這是不正確的行為 - 例如,該變量可能是阿拉伯語或英語用戶名。 在這種情況下,請在從右到左語言的變量之前插入一個從右到左的標記(RLM)字符U + 200F,或者在從左到右的語言的字符串變量之前,插入從左到右標記(LRM)字符U + 200E。 即使您沒有針對從右到左的語言的本地化,也可以將此技術(shù)用于從左到右的本地化。


Flipping Cocoa Touch Views and Controls Programmatically - 以編程方式翻轉(zhuǎn)Cocoa Touch視圖和控件

當語言是從右到左時,一些Cocoa Touch視圖不應(yīng)該自動翻轉(zhuǎn)。 在iOS 9和更高版本中,您可以使用為UIView定義的語義內(nèi)容屬性來指定某些視圖應(yīng)該如何顯示在從右到左的上下文中。

例如,如果您的應(yīng)用程序顯示代表視頻擦除器的滑塊,則可以使用UISemanticContentAttributePlayback值指示此視圖不應(yīng)在從右到左的上下文中翻轉(zhuǎn)。 要詳細了解可以使用的屬性,請參閱UISemanticContentAttribute

1. Flipping Images in an iOS App - 在iOS應(yīng)用程序中翻轉(zhuǎn)圖像

在從右向左語言中,要翻轉(zhuǎn)圖像資源,您可以選擇以下三個選項之一:


Flipping Cocoa Views and Controls Programmatically - 以編程方式翻轉(zhuǎn)Cocoa視圖和控件

當語言從右到左時,某些Cocoa視圖不會自動翻轉(zhuǎn)。 在您的Mac應(yīng)用程序中,您可以通過編程修復(fù)Interface Builder中的文本對齊和視圖的順序,以生成所需的鏡像結(jié)果。 您還可以翻轉(zhuǎn)不在應(yīng)用中反映的視圖。

1. Flipping Images - 翻轉(zhuǎn)圖像

對于從右向左語言要翻轉(zhuǎn)圖像資源,請選擇三種方法之一。 您可以為您支持的從右向左語言提供單獨的本地化資源,如Adding Additional Resources You Want to Localize中所述。 您可以為Xcode項目添加可替換的從右到左的圖像資源,并且在您的代碼中,使用從右到左語言的替換圖像。 對于從右向左的語言,您還可以在應(yīng)用程序代理的awakeFromNib方法中以編程方式翻轉(zhuǎn)圖像。

例如,調(diào)用此flipImage:方法返回鏡像圖像。

- (NSImage *)flipImage:(NSImage *)image
{
   NSImage *existingImage = image;
   NSSize existingSize = [existingImage size];
   NSSize newSize = NSMakeSize(existingSize.width, existingSize.height);
   NSImage *flippedImage = [[[NSImage alloc] initWithSize:newSize] autorelease];
 
   [flippedImage lockFocus];
   [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
 
   NSAffineTransform *transform = [NSAffineTransform transform];
   [transform translateXBy:existingSize.width yBy:0];
   [transform scaleXBy:-1 yBy:1];
   [transform concat];
 
   [existingImage drawAtPoint:NSZeroPoint fromRect:NSMakeRect(0, 0, newSize.width, newSize.height) operation:NSCompositeSourceOver fraction:1.0];
 
   [flippedImage unlockFocus];
 
   return flippedImage;
}

2. Flipping Toolbars - 翻轉(zhuǎn)工具欄

在Mac應(yīng)用程序中,工具欄不會自動針對從右到左的語言進行鏡像。 您可以通過編程方式利用awakeFromNib方法對工具欄項目的順序進行反向排列或?qū)崿F(xiàn)toolbarDefaultItemIdentifiers:代理方法以相反順序返回回工具欄項目。

例如,將此代碼片段添加到應(yīng)用程序委托的awakeFromNib方法實現(xiàn)中,其中toolbar是要翻轉(zhuǎn)的NSToolbar對象。

// Flip toolbar items order for RTL support
if ([NSApp userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft) {
   NSArray *toolbarItems = [[self.toolbar items] copy];
   for (NSToolbarItem *item in toolbarItems) {
       [self.toolbar removeItemAtIndex:toolbarItems.count-1];
       [self.toolbar insertItemWithItemIdentifier:item.itemIdentifier atIndex:0];
   }
}

如果控件上的圖像傳達方向 - 例如左箭頭和右箭頭 - 則應(yīng)該將其翻轉(zhuǎn)。

3. Flipping a Table View in a Mac App - 翻轉(zhuǎn)Mac App的Table View

注意:在iOS中,表格只有一列,所以您不必擔(dān)心鏡像列順序。

當布局是從右到左時,表不會自動鏡像。 列的順序不會改變。 如果使用自動布局和base internationalization,基于視圖的表格中的視圖會自動翻轉(zhuǎn),但基于單元格的表格中的headers和cells不會更改其文本對齊方式。

Changing Text Alignment - 更改文本對齊方式

對于基于單元格的表格,使用Interface Builder將列和單元格的對齊方式設(shè)置為自然書寫方向。

To set the text alignment of a column and its cell - 設(shè)置列及其單元格的文本對齊方式

  • Interface Builder中,選擇大綱視圖中的Table Column
  • 如有必要,請顯示屬性檢查器。
  • 從“對齊”控件中選擇“自然”。
  • 在大綱視圖中,單擊表格列旁邊的顯示三角形并選擇其Text Field Cell。
  • 在“屬性”檢查器中,從“對齊”控件中選擇自然( - - - )

或者,以編程方式將對象的alignment屬性設(shè)置為NSNaturalTextAlignment

Reversing Column Order - 反向列順序

對于Mac應(yīng)用程序,將此方法添加到NSTableView類(使用Objective-C類別),該類反轉(zhuǎn)表中列的順序。

@implementation NSTableView (RTLSupport)
- (void)reverseColumnOrder {
   if ([[NSApplication sharedApplication] userInterfaceLayoutDirection] != NSUserInterfaceLayoutDirectionRightToLeft)
       return;
   unsigned long index = self.tableColumns.count-1;
   while (index > 0) {
       [self moveColumn:0 toColumn:index];
       index--;
   }
}
@end

Testing Right-to-Left Locale Formats - 測試從右向左的區(qū)域設(shè)置格式

您不需要將語言更改為阿拉伯語或希伯來語,來測試從右向左的區(qū)域設(shè)置格式。而是在方案編輯器中更改語言和區(qū)域,如 Testing Specific Languages and Regions中所述。要更改文本方向而不更改語言或區(qū)域,請閱讀Testing Right-to-Left Layouts

要在iOS設(shè)備上測試從右到左的語言環(huán)境格式,請在“設(shè)置”中一起選擇區(qū)域和格式化語言,如Setting the Region on iOS Devices中所述。語言子菜單出現(xiàn)在區(qū)域彈出式菜單中,用于多個區(qū)域中使用的語言。要測試阿拉伯語國家的語言環(huán)境,請從阿拉伯語子菜單中選擇國家。要測試希伯來語的區(qū)域設(shè)置格式,請從區(qū)域彈出菜單中選擇希伯來語(以色列)。

要在Mac上測試從右到左的區(qū)域設(shè)置格式,請在系統(tǒng)偏好設(shè)置中分別選擇區(qū)域和格式化語言。如果要測試阿拉伯語的區(qū)域設(shè)置格式,請將區(qū)域設(shè)置設(shè)置為使用阿拉伯語的區(qū)域設(shè)置,并將格式語言更改為阿拉伯語。同樣,要測試希伯來語的區(qū)域設(shè)置格式,請將區(qū)域設(shè)置設(shè)置為以色列,并將格式語言設(shè)置為希伯來語?;蛘?,您可以設(shè)置區(qū)域,然后將首選語言設(shè)置為阿拉伯語或希伯來語。

To test the locale format in a right-to-left language on Mac - 在Mac上以從右到左的語言測試區(qū)域設(shè)置格式

  • 在系統(tǒng)偏好設(shè)置中,點擊Language & Region
  • 從“區(qū)域”彈出式菜單中選取一種使用該語言的區(qū)域。
    日歷設(shè)置會自動更改以匹配區(qū)域。
  • 點擊Advanced
  • General窗格中,從Format language彈出式菜單中選擇從右向左的語言。

后記

本篇主要講述了支持從右到左的語言,感興趣的給個贊或者關(guān)注~~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容