iOS App 本地化終極指南

了解 iOS App 本地化的來龍去脈,以及如何逐步讓您的應用程序為全球用戶群做好準備,包括演示應用程序 App 示例。

iOS 操作系統每年都在不斷發展壯大。對於 app 開發人員而言,Apple 對國際化的日益關注意味著更容易製作適合全球市場的應用程序。

App Store在 175 個國家/地區可用,每周有超過 50 億的訪問者,使 app 在盡可能多的地區和語言中可用,也是應用程序成功的必經之路,而現在做到這一點的簡便性意味著幾乎沒有任何藉口跳過它。

本分步指南將向您展示向全世界開放您的app是多麼簡單。我們將在 UIKit 和 SwiftUI 中進行 app 本地化,這使其適用於所有類型的團隊。

目錄

安裝和設置

在本教程中,我們將研究“Sleepy”,這是一款銷售助眠專輯的 iOS App 應用程序。演示應用程序將使我們能夠展示 iOS App 本地化的所有關鍵步驟。Sleepy 的靈感來自Uladzislau Luchkouski關於Sleepy 聲音的案例研究。雖然 Sleepy 使用 Swift 5,但我們將在 iOS 15 上使用 Xcode 版本 13.3.1 和 SwiftUI 3。

現在我們的環境已經準備就緒,我們已經準備好構建我們夢想的App 應用程序。第一步是考慮您想要支持的語言。在這種情況下,Sleepy 將以英語作為基本語言,它還將支持西班牙語和希伯來語——希伯來語將有助於處理從右到左 (RTL) 的語言。您可以根據您的應用程序 App 的需要隨意添加盡可能多的語言,並且 每次都可以重複相同的過程。

創建項目

從 iOS App 本地化這個簡單的應用程序中學到的原則可以應用於任何類型的App,無論大小。您可以在此處獲取UIKitSwiftUI中的完整項目。當您成功運行該項目時,您應該能夠看到睡眠聲音列表。點擊任何相冊將顯示更多詳細信息。

如何將支持的語言添加到我的應用程序?

iOS App 可以本地化到 100 多個語言環境和地區。iOS 使用兩個字母的 ISO 639-1 標準來表示語言,例如en英語、fr法語等。

🗒️注意 »如果 ISO 639-1 代碼不適用於特定語言,請改用 ISO 639-2 代碼。例如,夏威夷語沒有 ISO 639-1 代碼,因此使用 ISO 639-2 代碼,haw.

Apple 在其文檔中提供了有關語言代碼的更多信息。這些標識符告訴 iOS 系統您的App 本地化為哪種語言,並向用戶顯示該語言。

現在我們的項目已經準備就緒,讓我們進入有趣的部分:iOS App 本地化。

Project Navigator中選擇項目名稱。如果未選中,則選中Use Base Internationalization 。

基本 App 國際化將面向用戶的字符串.storyboard.xib文件分開。它使本地化人員無需 在 Interface Builder 中修改文件.storyboard。 .xib當您選中Use Base Internationalization選項時,Xcode 會將Main.storyboard和傳輸LaunchScreen.storyboardBase.lproj默認語言的文件夾中。您會記得我們在 iOS App本地化教程中的基本語言是英語。

🗒️注意 »如果您不啟用Use Base Internationalization ,您將必須手動管理所有本地化文件和文件夾結構。如果您需要自己管理本地化文件,則可以輕鬆閱讀官方指南

添加本地化語言

接下來是添加您想要支持的語言。在我們的例子中,我們將添加西班牙語和希伯來語。從Project Navigator ➞選擇項目名稱。在Localizations下,單擊加號 (+) 以添加您要支持的語言和地區。將顯示一個語言列表供您選擇您選擇的語言,讓我們從西班牙語開始。

選擇語言(在我們的示例中為西班牙語)後,將顯示用於創建所需語言本地化表的選擇文件和參考語言。取消選中LaunchScreen.storyboard。Apple 僅允許在 中使用靜態資產LaunchScreen,不支持在LaunchScreen.

在上面的屏幕中,有兩件事需要您注意:

  1. 參考語言——我們設計應用程序所使用的基本語言,默認為 英語。建議使用英語(或您團隊的母語/流利的語言)。將其更改為另一種語言將使用該語言的鍵創建所有本地化文件。由於基本語言應該是本地化的指南,因此建議保持這種狀態。
  2. 文件類型——確保所有文件都設置為Localizable Strings
  3. 如上圖所示,點擊完成。

對應用程序應支持的任意數量的語言重複這些相同的步驟。

添加語言支持後項目的變化

添加所有支持的語言後,您會發現項目發生了一些變化。讓我們回顧一下這些變化,以及它對我們的本地化目標意味著什麼。

  • 語言文件夾:Xcode 將創建es.lproj並分別he.lproj包含Main.strings西班牙語和希伯來語。
  • 故事板:Main.storyboard現在應該是一個包含基本語言Main.storyboardMain.strings支持語言的文件夾。

如何使用翻譯文件?

在我們的iOS App 本地化之旅中,我們會遇到不同的文件,它們都可以幫助我們實現我們的目標。

  • 字符串文件:字符串文件包含一種語言的面向用戶的本地化字符串的翻譯,帶有可選註釋。字符串文件中每個字符串的語法是一個鍵值對,其中是用於查找包含翻譯的key標識符。value
  • lproj文件夾:是一個目錄,用於存儲特定於語言的資源,例如es.lprojhe.lproj.
  • XLIFF:是一種基於 XML 的雙文本格式,它標準化了在本地化過程中如何在工具之間傳遞可本地化的數據。

🔗資源 » 在 Apple 文檔中了解有關 XLIFF 格式的更多信息。

我如何處理語言回退?

我知道您可能會問自己,如果用戶使用您的App 不支持的語言或者您的App  支持該語言但並非該特定語言的每個字符串都已本地化,會發生什麼情況?

  • 對於完全不支持的語言,iOS 將默認使用基本語言或開發語言。
  • 對於部分翻譯的語言,Apple 使用一種算法來幫助確定用戶應該看到哪種語言。以下是偽代碼中的算法:
func determineTheLanguageToUse() {
    for each user's preferredLanguages
      if app supports the language
        return the language
      if app supports a more generic dialect
        return the generic language

     // Exhausted preferredLanguages and still cannot determine..
     return CFBundleDevelopmentRegion
}代碼語言: Swift  斯威夫特

🗒️ 注意 »用戶preferredLanguages是在 iOS 的設置應用程序 ➞ 常規 ➞ 語言和地區中列出的用戶。

通用方言

語言選擇的偽代碼非常簡單,只是它不涵蓋通用方言。iOS 支持的語言不止一種方言。en英語可以有不同的方言,例如en-GB英語(英國)、en-US英語(美國)、en-IE英語(愛爾蘭)等。在我們當前的應用程序中,如果用戶願意en-GBen將使用 , 因為它是最接近通用方言en-GB.

注意 »反之則不然。如果應用程序支持en-GB(而不是en),那麼如果用戶更喜歡en,則en-GB不會是後備方案,因為en-GB它不是更通用。在這種情況下,它默認為CFBundleDevelopmentRegion,這是應用程序的默認語言和區域。

🤿更深入 »官方文檔有更多關於如何進行語言環境匹配和回退決策的詳細信息。

程序化回退

為了防止任何意外行為,我們可以創建一個擴展函數,該函數封裝了當找不到首選語言時NSLocalizedString所需的回退。defaultLanguage這將在整個項目中使用。

/*
Utils.swift
*/

extension String {

     func localize(comment: String = "") -> String {
         let defaultLanguage = "en"
         let value = NSLocalizedString(self, comment: comment)
         if value != self || NSLocale.preferredLanguages.first == defaultLanguage {
             return value // String localization was found
         }

				 // Load resource for default language to be used as
         // the fallback language
         guard let path = Bundle.main.path(forResource: defaultLanguage, ofType: "lproj"), let bundle = Bundle(path: path) else {
             return value
         }

         return NSLocalizedString(self, bundle: bundle, comment: "")
    }
}代碼語言: Swift  斯威夫特

我們可以localize()如下使用。

// Prints the translation of the key localised to the user's
// language or default to English
print("translation.key".localize()) 

使用 Localizable.strings

Localizable.strings將要在應用程序中使用的字符串存儲為鍵值對,並將用於以您支持的語言進行本地化。

讓我們Localizable.strings通過轉到文件新建文件或只需按Cmd+N來創建。搜索“字符串”,您將在資源窗格中看到字符串文件

選擇如上圖所示的Strings File ,然後點擊Next。命名文件Localizable創建文件。

點擊新創建的Localizable.strings文件,然後點擊檢查器中的本地化在出現的警告中,點擊“本地化”以創建英語的本地化文件。

Inspector中,在 Localization 部分下檢查您的應用程序的所有其他受支持的本地化,以創建這些語言的本地化字符串。

為譯員導出可本地化的文件

本地化可能需要大量工作。來自谷歌的直接翻譯並不總是足夠好。您可能需要像 LANCER 這樣的專家來為您解決這個難題,這樣您就可以專注於構建產品。您可以為翻譯導出您的字符串。在專家完成翻譯後,只需將翻譯後的字符串導入回您的應用程序中即可使用。

在這種方法中,我們將看到如何為本地化人員(翻譯人員)導出可本地化的文件。為此,首先為 Localization 創建一個單獨的文件夾(如下所示):

如您所見,Localization文件夾中有兩個文件夾。To Localizers是我們作為開發人員為翻譯人員導出可本地化文件的文件夾。From Localizers是我們將本地化文件從翻譯器導入到我們的項目的文件夾。創建文件夾後,返回我們的 Xcode 項目並再次打開根文件夾信息設置。讓我們通過轉到產品菜單導出本地化來導出。

點擊“導出本地化”選項後,Xcode 會要求您將可本地化的文件保存到指定的文件夾中,如下所示:

這將以 XLIFF 格式導出所有選定的本地化,本地化人員可以使用該格式來本地化您的應用程序。翻譯完成後,他們會發回一個 XLIFF 文件,您應該保存該文件From Localizers以便導入。要導入本地化,請轉至產品菜單導入本地化在 中選擇文件 From Localizers

如何本地化我的故事板?

本地化可以在 UIKit 中主要在 2 個級別上完成。直接在故事板上本地化,主要用於靜態文本,並以編程方式進行本地化。我們將從如何直接本地化故事板開始。

我們已經在設置步驟中為故事板本地化奠定了基礎。在“語言支持後項目的更改”部分中,我們看到它Main.strings是為我們的非基礎支持語言創建的。這些Main.strings包含故事板中標籤的 ID。

當我們選擇Main(Spanish)文件時,我們會看到對象 ID 及其文本的鍵值對,表示這些字符串將如何以西班牙語顯示。如您所見,它仍然是英文的,因此我們必須將其本地化為西班牙文。

翻譯後。

現在讓我們以西班牙語運行該應用程序,看看我們的本地化是否有效。默認情況下,每次運行應用程序時,它都會使用基本語言。您可以通過Option + 點擊Play) Start active scheme button使用不同的語言環境運行您的應用程序,然後轉到Run → Options → App Language → Change to a supported language(在本例中為西​​班牙語)→ 點擊Run

文件Main(Spanish)已翻譯。應用程序的其餘部分將隨著我們的移動而逐漸翻譯。現在我們剛剛學習瞭如何本地化情節提要,您可以按照相同的步驟將情節提要本地化為希伯來語。

如何本地化 Swift 代碼中的字符串?

我們還可以使用這些Localizable文件以編程方式本地化我們的應用程序。Localizable文件還使用格式中的鍵值"key" = "value";對進行本地化。在Localizable(English)文件中,我們將添加表示音樂數據的其餘字符串。

/*
Localizable.strings
*/

/* Titles of Sleep albums */
"slumber" = "Slumber";
"white.noise" = "White Noise";
"soothing" = "Soothing";
"paino" = "Piano";
"wind" = "Wind";
"cold.fusion" = "Cold Fusion";

/* Categories of Sleep albums */
"zen" = "Zen";
"instrumental" = "Instrumental";
"nature" = "Nature";

/* About of Sleep albums */
"about1" = "An acoustic mix has been specially selected for you. The camping atmosphere will help you improve your sleep and your body as a whole. Your dreams will be delightful and vivid.";代碼語言: Swift  斯威夫特

iOS 已經為我們提供了一種輕鬆的方式來使用它們的鍵來顯示這些字符串,以便於本地化。NSLocalizedString從默認表返回字符串的本地化版本,Xcode 在導出本地化時自動生成。

回顧編程回退****部分,我們創建的擴展函數使用了NSLocalizedString兩個最常見的實現。

  • NSLocalizedString(key, comment):key對於默認表中的字符串,並comment有助於為翻譯人員提供有關如何在應用程序中使用該字符串的上下文。
  • NSLocalizedString(key, tableName, bundle, value, comment):當您想將字符串文件拆分為更小、易於管理的大小時,此簽名會很有用。當您正在開發一個非常大的應用程序並且您不想將所有可本地化的字符串集中在一起時,這一點尤其重要。Localizable.strings****文件。默認NSLocalizedString(key, comment)只讀取文件。Localizable.strings在這個簽名中:
    • tableName 是包含鍵值對的表的名稱。
    • bundle是文件系統中的一個目錄,它將可執行代碼和相關資源集中在一個地方。我們經常只是Bundle.main在這裡使用。
    • value是您想要默認的字符串,以防找不到所key提供的字符串。

有了這些新知識,讓我們針對西班牙語和希伯來語進行本地化,並使用localize()我們已經在Programmatic fallback中創建的擴展函數。

/*
Localizable.strings
*/

/* Titles of Sleep albums */
"slumber" = "תְנוּמָה";
"white.noise" = "רעש לבן";
"soothing" = "הַרגָעָה";
"paino" = "פְּסַנְתֵר";
"wind" = "רוּחַ";

/* Categories of Sleep albums */
"cold.fusion" = "זן";
"zen" = "מוֹעִיל";
"instrumental" = "טִבעִי";

/* About Sleep albums */
"about.acoustic" = "מיקס אקוסטי נבחר במיוחד עבורכם. אווירת הקמפינג תעזור לכם לשפר את השינה ואת הגוף כולו. החלומות שלך יהיו מענגים וחיים.";
代碼語言: Swift  斯威夫特

Utils.swift我們將使用擴展功能本地化歌曲數據。如果未找到翻譯,這將本地化字符串並回退到默認語言。

/*
Utils.swift
*/

SleepData(
    image: "image1",
    title: "slumber".localize(),
    numberOfSongs: 4,
    category: "zen".localize(),
    songs: ["Friday Night Lights", "4 your eyes only", "Love yours"],
    about: "about.acoustic".localize())

🗒注意 » title6是英文的Cold Fusion沒有翻譯,因此我們轉而使用英文來翻譯該字符串。

如何使用用戶的首選系統區域設置?

當應用程序支持當前語言環境時,iOS 系統會自動處理應用程序的語言環境切換,例如,如果手機的語言設置為希伯來語,我將看到該應用程序的希伯來語版本。如果語言切換為西班牙語,iOS 系統會將應用程序版本更改為西班牙語。如果語言更改為沒有本地化的語言,則應用程序將使用基本語言。

應用內語言環境切換

最好讓操作系統處理用戶的首選語言環境,並讓您的應用程序適應它。事實上,Apple 警告應用程序不要自行切換語言環境:所有編程方法都可能導致無法預料的更改,並且在 iOS 更新後可能無法正常工作。處理此問題的首選方法是以編程方式打開應用程序的首選語言設置,以便用戶可以自行更改設置。

這是打開應用程序設置以供用戶更改語言的代碼片段。在您應用程序的任何適當部分使用它,例如在 Sleepy 中,我們可以在主屏幕的菜單中使用它。

if let settingsURL = URL(string: UIApplication.openSettingsURLString) {
    UIApplication.shared.open(settingsURL, options: [:], completionHandler: nil)
}代碼語言: Swift  斯威夫特

編程語言切換

儘管 Apple 不推薦,但用例不同,您可能需要通過代碼更改語言環境。iOS 使用密鑰將區域設置保存在用戶默認值中AppleLanguages,更改此設置將更新應用程序的區域設置。問題是必須重新打開應用程序才能看到更改。我們將使用通知來提示用戶重新打開應用程序。您可以選擇顯示警告或表格來解釋為什麼用戶在更改語言後需要重新打開應用程序。解決此問題的最佳用戶體驗可能會有所不同,因此我們讓您自己做出決定。我們將為我們的應用程序 Sleepy 使用通知。

/*
ViewController.swift
*/

private func setLangauge(languageCode: String, language: String) {
     let alert = UIAlertController(title: nil, message: "changing.language".localize(), preferredStyle: .alert)

      alert.addAction(UIAlertAction(title: "exit.sleepy".localize() , style: .default, handler: { [weak self](_) in
						// Update app's language with the language code
            UserDefaults.standard.set([languageCode], forKey: "AppleLanguages")
            UserDefaults.standard.synchronize()

            self?.closeApplicationWithNotification(language: language)
    }))

		 // Show change language alert to user
     self.present(alert, animated: true, completion: nil)
}

 private func closeApplicationWithNotification(language: String) {
     let content = UNMutableNotificationContent()
     content.title = "Language changed to \(language)"
     content.body = "Tap to reopen the application"
     content.sound = UNNotificationSound.default

     let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.5, repeats: false)
     let identifier = "sleepy"
     let request = UNNotificationRequest.init(identifier: identifier, content: content, trigger: trigger)
     let center = UNUserNotificationCenter.current()
     center.add(request)

     exit(EXIT_SUCCESS)
}代碼語言: JavaScript  javascript 

這兩個函數將幫助我們更改應用程序的區域設置並向用戶發送通知以點擊它以打開應用程序。該功能closeApplicationWithNotification是可選的,重新打開應用程序的用戶體驗應該按照您認為合適的方式進行處理。我們使用exit(EXIT_SUCCESS)關閉應用程序來重新啟動本地化更改以完全應用到應用程序,例如希伯來語切換到從右到左。

🔗資源 »查看如何以編程方式退出我的 iOS 應用程序?在蘋果官方文檔中。

讓我們看看我們如何在我們的應用程序中使用我們的函數。我們將有一個菜單顯示支持的語言,選擇一種語言將更改應用程序語言。

/*
ViewController.swift
*/

func configureActionItemMenu() {
    let menuItems = [
         UIAction(title: "English", handler: { [weak   self] (_) in
             self?.setLangauge(languageCode: "en", language: "English")
        }),
         UIAction(title: "Hebrew",handler: { [weak   self] (_) in
             self?.setLangauge(languageCode: "he", language: "Hebrew")
        }),
         UIAction(title: "Spanish", handler: { [weak   self] (_) in
         self?.setLangauge(languageCode: "es", language: "Spanish")
        })
    ]

    let languageMenu = UIMenu(
			title: "choose.language".localize(), 
			image: nil, 
			identifier: nil, 
			options: [], 
			children: menuItems
		)

    navigationItem.rightBarButtonItem = UIBarButtonItem(
			title: "choose.language".localize(), 
			image: UIImage(systemName: "gear"), 
			primaryAction: nil, 
			menu: languageMenu
		)
    navigationItem.rightBarButtonItem?.tintColor = .white
}

如何在我的翻譯字符串中使用動態值?

插值是字符串最常見的用例之一,那麼當您想將它與本地化字符串一起使用時會發生什麼?再一次,我們將構建我們的擴展,使整個項目的插值變得簡單和乾淨。

/*
Utils.swift
SleepyUIKit
*/

extension String {
    // ...

    func localizeFormat(args: [CVarArg], comment: String = "") -> String {
        return self.localizeStringFormat(key: self, comment: comment, args: args)
    }

    func localizeStringFormat(key: String, comment: String = "", args: CVarArg... ) -> String {
        let format = NSLocalizedString(key, comment: comment)
        let result = withVaList(args) {
            (NSString(format: format, locale: NSLocale.current, arguments: $0) as String)
        }
        return result
    }
}代碼語言: Swift  斯威夫特

添加以下本地化Localizable.strings以用於插值。字符串說明符是特殊字符,指示插值參數的類型。您可以將單個或多個說明符添加到同一字符串插值中。可以在此處找到我們可用的所有說明符的完整列表。

"sleep.points" = "%1lu Sleep Points"; // Number interpolation
"hello.user" = "Hello %1$@"; // String interpolation
"share" = "Share %1lu song to %2$@"; // Multiple interpolations代碼語言: Swift  斯威夫特

現在在我們的代碼中,我們可以將這些字符串與擴展函數一起使用。數字格式將在本文後面更深入地解決。

// Output assumes English (en-US) is the active locale

someLabel.text = "sleep.points".localizeFormat(args: [3000])
// => 3,000 Sleep Points

someLabel.text = "hello.user".localizeFormat(args: ["John"])
// => Hello John

someLabel.text = "share".localizeFormat(args: [1, "Norris"])
// => Share 1 song to Norris

如何使用本地化複數字符串?

目前,在我們的應用程序中,即使睡眠專輯只有 1 首“歌曲”,我們也會顯示“歌曲”。複數有助於管理此類情況,以確保您的應用程序遵循每種語言的正確語法規則。Xcode 使用.stringsdict文件為複數生成本地化,讓我們創建一個,以便我們可以修復應用程序中的複數問題。

讓我們.stringsdict通過轉到文件 ➞ 新建 ➞ 文件或只需點擊Ctrl+N或來創建Cmd+N。搜索“stringsdict”,您將在資源窗格中看到字符串文件。點擊下一步並按照提示創建文件。

點擊新創建的Localizable.stringsdict文件,然後點擊Inspector中的Localize在出現的警告中,點擊“本地化”以創建英語的本地化文件。在Inspector中,在Localization部分下檢查您的應用程序的所有其他受支持的本地化,以便為這些語言創建本地化字符串。

<!-- Localizable(English).stringsdict -->

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>songs</key> <!-- Localized String Key -->
	<dict>
		<key>NSStringLocalizedFormatKey</key>
		<string>%#@songsCount@</string>
		<key>songsCount</key> <!-- Variable -->
		<dict>
			<key>NSStringFormatSpecTypeKey</key>
			<string>NSStringPluralRuleType</string>
			<key>NSStringFormatValueTypeKey</key>
			<string>d</string>
			<key>zero</key>
			<string>No Songs</string>
			<key>one</key>
			<string>%d Song</string>
			<key>other</key>
			<string>%d Songs</string>
		</dict>
	</dict>
</dict>
</plist>代碼語言: Swift  斯威夫特

讓我們逐步了解它。

  • Localized String Key:要在 NSLocalizedString 中使用的鍵。
  • NSStringLocalizedFormatKey
    • 要本地化的文本,即。%#@songsCount@.
    • 變量應以格式定義,%#@併後跟@.
    • 只為有復數的參數定義變量。
  • 變量:適用於特定變量的規則。您為在 ie 中定義的每個變量創建一個NSStringLocalizedFormatKeysongsCount.
  • NSStringFormatSpecTypeKey:處理參數的規則。它已經設置為NSStringPluralRuleType所以我們可以保持原樣。
  • NSStringFormatValueTypeKey:參數的格式,如d表示整數或f表示雙精度。有關完整列表,您可以查看Apple 的字符串格式說明符
  • CLDR 語言複數規則:您可以選擇不同的複數規則,例如zeroonetwofewmany, 和other。對於某些語言,例如英語,您只需要配置兩個規則,oneother. 其他語言只有一個複數規則,有些語言有兩個以上。此處提供了詳細指南。

讓我們更改我們的代碼以正確格式化複數。好消息:我們不需要創建一個新的擴展函數來處理這個,localizeFormat已經處理了複數。

someLabel.text = "songs".localizeFormat(args: [1])

如何本地化數字?

格式化數字是本地化中經常被遺忘的一個方面,因為並非所有語言都以相同的方式格式化數字。iOS 提供了一個NumberFormatter負責處理不同語言環境格式的工具。我們的應用程序中缺少的是顯示專輯的價格,我們將以此為契機利用NumberFormatter.

/*
SleepDetailViewController.swift
*/
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currency
priceButton.setTitle(numberFormatter.string(from: 99.99), for: .normal)代碼語言: Swift  斯威夫特

運行應用程序,應用程序語言為希伯來語,應用程序區域為以色列。

數字格式化的另一個常見用例是小數。格式numberFormatter.numberStyle = .currency樣式正確顯示數字以適合用戶的區域設置,例如 123456789 對於英語、美國 ( en-US) 將顯示為 $123,456,789.00,對於西班牙語、西班牙 ( es-ES) 將顯示為 1.234.567.899,00。

注意 »數字格式因地區而異。默認情況下使用用戶的區域設置,但您可以指定數字的區域設置以numberFormatter.locale = Locale(identifier: "en-US")避免任何意外,例如使用 123456789 將是 $123,456,789.00en-US和 ₹1,234,567,899.00 en-IN

🔗資源 » NumberFormatter可以做的不僅僅是貨幣本地化,請查看文檔中的完整樣式列表。

如何本地化日期?

以用戶的語言環境顯示日期是一種很好的做法。該DateFormatter課程使這變得容易。讓我們在打開相冊時顯示當前日期。

🔗資源 » DateFormatter提供更多內容,請閱讀文檔以深入研究。

/*
	SleepDetailViewController.swift
*/

let dateformatter = DateFormatter()
dateformatter.dateStyle = .long
dateLabel.text = dateformatter.string(from: Date())

我們已經了解瞭如何在解決最常見的本地化問題的同時本地化我們的應用程序。現在讓我們將注意力轉移到如何使用 SwiftUI 進行本地化。

如何本地化我的 SwiftUI 視圖?

SwiftUI 是一個聲明式現代框架,可幫助在所有 Apple 平台上構建應用程序。SwiftUI 具有強大的本地化支持並且需要更少的工作。Text,最常見的 SwiftUI 視圖已經預先構建並支持LocalizedStringKey,這意味著傳遞本地化字符串的鍵就可以了。本地化的設置與 UIKit 中的相同,因此請繼續並按照相同的步驟進行設置。

讓我們使用 SwiftUI 中的通用視圖Text來演示這一點。Localizable.strings由於 SwiftUI 中沒有故事板,因此讓我們將故事板本地化字符串複製到其中。

/*
Localizable.strings
*/
"list.of.songs" = "LIST OF SONGS";
"about.this.pack" = "About this pack";代碼語言: Swift  斯威夫特
/*
SleepDetailView.swift
*/

Text("about.this.pack")
    .font(.title3)
    .fontWeight(.semibold)
    .foregroundColor(.white)

通過僅傳遞本地化字符串的鍵,About pack 已本地化為希伯來語和西班牙語。

SwiftUI 翻譯預覽

借助 SwiftUI 預覽的強大功能,您可以通過將語言環境指示為環境來預覽本地化。Xcode 中默認顯示預覽,但如果您的預覽未顯示,則可以使用快捷方式Option + Command + Return來打開和關閉它。

/*
SleepDetailView.swift
*/

struct SleepDetailView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
         SleepDetailView(sleeper: SleepData.list.first!)
            .environment(\.locale, .init(identifier: "en"))

         SleepDetailView(sleeper: SleepData.list.first!)
            .environment(\.locale, .init(identifier: "he"))
        }
    }
}

插值

插值可以通過對我們的進行一些更改來實現Localizable.strings,當我們為 SwiftUI 進行本地化時,我們的字符串的鍵需要包含說明符。

// UIKit
"hello.user" = "Hello %@";代碼語言: Swift  斯威夫特

……變成……

// SwiftUI
"hello.user %@" = "Hello %@";代碼語言: Swift  斯威夫特

然後我們可以在我們的視圖中使用它。

let user = "Conan"

Text("hello.user \(user)") // Hello Conan
.foregroundColor(.white.opacity(0.7))
.font(.subheadline)

複數

SwiftUI 中的複數遵循與 UIKit 中相同的模式,通過使用Localizable.stringsdict. SwiftUI 的變化是我們必須將說明符添加到Localized String Key

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>songs %d</key> <!-- Localized String Key -->
	<dict>
		<key>NSStringLocalizedFormatKey</key>
		<string>%#@songsCount@</string>
		<key>songsCount</key>
		<dict>
			<key>NSStringFormatSpecTypeKey</key>
			<string>NSStringPluralRuleType</string>
			<key>NSStringFormatValueTypeKey</key>
			<string>d</string>
			<key>zero</key>
			<string>No Songs</string>
			<key>one</key>
			<string>%d Song</string>
			<key>other</key>
			<string>%d Songs</string>
		</dict>
	</dict>
</dict>
</plist>代碼語言: Swift  斯威夫特
/*
SleeperView.swift
*/

Text("\(5) songs")
    .foregroundColor(.white.opacity(0.7))
    .font(.subheadline)

組合複數和插值

在構建您的應用程序時,事情可能並不總是一帆風順。可以有復數、插值等各種組合,全部混合。讓我們看一下組合複數和插值。

<!-- Localizable(English).stringsdict -->

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>%lld songs %@</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@songsCount@</string>
        <key>songsCount</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>zero</key>
            <string>No Songs • %@</string>
            <key>one</key>
            <string>%d Song • %@</string>
            <key>other</key>
            <string>%d Songs • %@</string>
        </dict>
    </dict>
</dict>
</plist>代碼語言: Swift  斯威夫特
/*
SleepDetailView.swift
*/

Text("\(sleeper.numberOfSongs) songs • \(sleeper.category)")
    .foregroundColor(.white.opacity(0.7))
    .font(.subheadline)

添加評論

我們已經看到在本地化字符串時添加註釋的重要性。讓我們繼續我們在 SwiftUI 中的最佳實踐。

Text("sleepy", comment: "Navigation title")

為非文本視圖添加本地化字符串

對於文本視圖以外的任何內容,請使用文本視圖初始化視圖或為您的應用添加字符串以提供本地化視圖。您可以本地化其他視圖,例如LabelPicker,因為它們接受LocalizedStringKey. 最簡單的方法是傳遞Text到接受它的視圖或使用localize()我們在 UIKit 中一直使用的擴展函數。

"sleep.points" = "%1lu Sleep Points";代碼語言: Swift  斯威夫特
navigationTitle(Text("\(3000) sleep.points"))
// => 3000 Sleep Points代碼語言: Swift  斯威夫特
navigationTitle("sleep.points".localizeFormat(args: [3000]))
// => 3000 Sleep Points

編程語言切換

我們將利用 UIKit 示例中的相同功能在 SwiftUI 中實現這一點。

/*
ContentView.swift
*/
...
.alert("changing.language", isPresented: $showRestartApplication, actions: {
  Button("exit.sleepy") {
      UserDefaults.standard.set([selectedLanguage.code], forKey: "AppleLanguages")
      UserDefaults.standard.synchronize()
      self.closeApplicationWithNotification(language: selectedLanguage.name)
  }
})

總結

現在我們準備好與全世界分享我們美妙的睡眠專輯。我們已經了解瞭如何使用 UIKit 和 SwiftUI 實現行業標準的 iOS App 本地化水平。我們經歷了常規場景和復雜場景。有了這個,您的App就可以征服國際市場了。

就這麼簡單,LANCER 甚至可以讓它變得更簡單。作為專業的App本地化解決方案,LANCER 具有強大的 Web 管理控制台,可幫助翻譯人員和開發人員更高效地協作和 App 本地化應用程序。它還為開發人員提供了一個功能齊全的 API 來連接,以及越來越多的第三方集成。LANCER 可以從頭到尾簡化您團隊的App本地化工作流程。

Read More

App 應用程序本地化:它是什麼,以及如何讓它發揮作用

移動應用程序本地化是為不同目標市場的用戶調整應用程序的用戶界面和功能的過程。探索讓它為您的企業服務的最有效方法。

送外賣?有一個 App 應用程序。網上銀行業務?也有一個 App 應用程序。您明白了:從娛樂和教育到交通和商業——如果有您想要完成的任務或您需要的信息,很可能可以在您的智能手機上找到。

2021 年,全球連接設備的移動應用 App 下載量達到230B,用戶對母語內容從未如此“渴望”。如果您想覆蓋盡可能多的用戶,語言和文化不應成為讓他們從您的 App 中受益的障礙。

可以擴大您的移動應用程序在全球的覆蓋範圍、下載率和收入數字的關鍵因素是 App 應用程序本地化。App 本地化是一個涉及多個步驟的多方面過程,需要合理的策略和強大的技術。

在本指南中,我們將探討 App 本地化的優勢和挑戰,解釋 App 本地化工具如何簡化流程,並提供 App 本地化技巧以幫助您開始面向未來的工作流程。讓我們開始吧!

什麼是 App 本地化?

移動應用程序 App 本地化是為不同目標市場的用戶調整 App 應用程序的用戶界面和功能的過程。

本地化移動應用程序 App 遠遠超出了簡單的翻譯:雖然翻譯側重於將文本內容從一種語言直接轉換為另一種語言,但本地化可確保 App 應用程序的每一項資產——無論是用戶界面 (UI) 元素、特定功能、應用程序內復制、圖片或應用商店描述——根據用戶的文化偏好、習慣或期望量身定制。

為什麼要本地化您的App

雖然英語被廣泛認為是一種“通用語言”,一種促進不同母語之間交流的通用語言,但研究表明,用戶更喜歡使用他們自己的語言的內容

對於有全球抱負的企業來說,採用App 應用程序本地化路線是不二之選。全球有數十億 App 應用程序用戶無法使用未本地化的 App 應用程序 – 本地化可讓您定位全球每個國家/地區的App 用戶,並最大限度地提高 App的曝光率和覆蓋率。

App 本地化的一些商業利益包括:

  • 開拓新市場:App 本地化是應用市場擴張的關鍵。想想 Airbnb——這家以其創始人的公寓起家的公司現在遍布全球220 多個國家,價值從零增長到今天的大約 $75B
  • 提高 App 參與度:用戶喜歡根據自己的喜好和需求量身定制的應用程序內容。它對用戶體驗產生巨大影響,並且可以幫助您提高參與度和忠誠度。
  • 增加 App 下載量和知名度:研究表明,使用本地語言編寫的應用程序商店說明可以將應用程序下載量提高多達 38%
  • 促進銷售:投資本地化意味著您的市場份額會隨著您進入的每個國家/地區而顯著增加,您的收入流也會隨之增加。可能沒有放之四海而皆準的本地化 ROI 模型,但據報導,財富 500 強公司在投資本地化時會產生更高的收入。

移動應用程序本地化的類型

就像您可以只開發應用程序的核心功能來解決特定問題並滿足特定利基市場(稱為最小可行產品 (MVP))或全力以赴開發一樣,應用程序本地化可以分層次開展。

根據其範圍,有兩種主要類型的應用程序本地化需要考慮。

最小可行本地化 (MVL)

MVL 旨在僅本地化應用程序的關鍵功能或內容、應用程序商店描述和應用程序商店元數據。這種類型的應用程序本地化非常適合優先考慮快速上市和高投資回報率的早期應用程序初創公司,因為它比完整的應用程序本地化需要更少的精力和資源。

一個很好的例子是 Evernote,一款流行的筆記應用程序 App,於 2012 年在中國推出,其簡化的產品、本地語言品牌名稱印象筆記(印象筆記)和基本語言盒。

一年後,當 Evernote 已經擁有400 萬中國用戶時,該公司推出了音象筆跡業務。商務平台是一款完全中國化的產品,通過在中國本地託管應用程序數據,甚至克服了因中國與海外國家之間的網絡帶寬非常小而導致的互聯網連接挑戰。

完整的App本地化

致力於創建完全本地化的App並最大限度地擴大其App的覆蓋面、用戶群、收入機會和投資回報率的全球App公司應該考慮全面的App本地化。

這需要為每個目標市場調整每個應用程序元素,包括應用程序商店本地化。完整的應用程序本地化可確保所有市場的用戶在使用您的App時都有賓至如歸的感覺。

在整個應用程序級別進行本地化的一個很好的例子是 Airbnb——對於其 220 多個語言環境和 60 多種語言中的每一個,該應用程序都本地化了從應用程序用戶界面和內容到可用支付方式的所有內容。Airbnb 前語言經理葛中軍描述了中國市場的情況:

“啟用支付寶和微信支付,推出微信小程序,使用中國地圖,跟進中國最新的營銷策略,讓中國房東和房客更方便地搜索房源,在中國設立服務器……Airbnb在中國的本地化中國是一個高度綜合的國家,涵蓋本地化產品開發、本地招聘、本地運營、本地決策、總部與本地辦公室之間的技術和信息交流等。”

制定 App 本地化策略

App 本地化過程從策略開始。換句話說,你需要一個可靠的計劃。您的App 本地化策略應考慮:

  • 您將為哪些市場本地化您的App 應用程序?
  • 文化差異對您的溝通方式意味著什麼?
  • 您會首先在區域內啟動還是從一開始就走向全球?
  • 您的 App 本地化預算是多少?
  • 您將優先對應用程序的哪些部分進行本地化?
  • 您將如何收集代碼以外的資源:內容、圖像、視頻?
  • 誰將負責 App 本地化?
  • 您將在 App 本地化工作流程中包含哪些利益相關者?
  • 您的App 本地化時間表或路線圖是什麼?
  • 您將使用哪些語言服務提供商?
  • 所有相關團隊將如何協作?
  • 您將如何監控該過程?
  • 您將使用什麼 App 本地化平台?
  • 您將如何進行語言質量保證 (LQA)?
  • 您將如何避免瓶頸和延誤?
  • 您將跟踪哪些指標和 KPI?
  • 您將如何測試App的本地化版本?
  • 你會進行應用商店(ASO)優化嗎?
  • 您將如何根據應用商店反饋進行迭代?
  • 你將如何衡量成功?

您的App本地化策略可能因應用程序而異,並會隨著應用程序的需求而變化,但最好在應用程序開發和設計期間規劃本地化,使本地化成為應用程序生命週期的一部分。

有效 App 本地化的最常見障礙

無論您是想在全球範圍內發布您的App 產品,還是只想針對幾個選定的市場進行 App 本地化,您都可能會遇到許多挑戰,如果不提前解決,這些挑戰可能會減慢您的工作速度,甚至會導致問題。

挑戰:不可預見的延誤和額外費用

應用程序開發公司在不考慮其未來的全球擴張的情況下設計和編寫應用程序的情況並不少見,忘記了本地化,直到為時已晚。

為何重要:當需要使應用程序適應新市場時,這種失誤可能會導致問題的發生——你可能無法在不造成延誤和額外費用的情況下解決這些問題。

有什麼幫助:從一開始就確保國際化和全球準備就緒

雖然通過自動化和集中化減少手動工作和瓶頸當然有助於降低成本和加快 App 本地化,但如果應用程序開發在設計之初就沒有考慮到 App 本地化,它們可能不會有太大幫助。

確保應用程序順利啟動的最佳方法是在應用程序開發和設計的早期階段處理 App 國際化。當您從一開始就構建支持多種語言的App 應用程序時,您可以更有效地管理 App 本地化工作和成本。

挑戰:在 App 發佈時檢測到質量問題

許多本地化的App 進入應用商店後卻發現 App 本地化錯誤——例如 App 字符串被錯誤翻譯甚至無法理解——導致他們的App 完全無法使用。

為什麼重要:App 發佈時的本地化問題可能會損害您App的聲譽,導致用戶在未能正確使用您的App後放棄您的App,甚至給您帶來差評。

有什麼幫助:在 App 發布前驗證 App 本地化質量

在 App 發佈時避免 App 本地化錯誤的最佳方法是投資於每種語言的測試和質量保證。對於無法完全測試每個字符串、佈局、日期、時間、數字和貨幣格式的情況,請考慮使用偽本地化——用偽語言替換所有可本地化的 UI 元素,以檢查是否有任何源字符串包含之前需要修復的問題翻譯過程開始。

開發人員可以使用多種偽本地化工具來測試可用性、可讀性、空間要求和用戶輸入——您可以首先檢查 GitHub 上是否有可能適用於您自己的項目的存儲庫。

挑戰:App 本地化跟不上發展

在快節奏的App 開發工作流程中,如果將本地化設置為敏捷框架之外的單獨功能,則本地化工作可能會滯後於應用程序開發。

為什麼重要:在應用程序發布之前必須等待 App 本地化會導致應用程序發布延遲並阻止應用程序開發人員在等待應用程序翻譯時開發新功能,從而增加成本。此外,所有利益相關者(包括翻譯人員)之間的持續溝通和反饋循環中斷,導致潛在的時間、金錢、生產力和質量損失。

有何幫助:在單一工作流程中設置 App 本地化和應用程序開發

避免 App 本地化落後於應用程序開發的最佳方法是設置一個內置於敏捷應用程序開發框架中的App 本地化流程。持續發展需要持續本土化。

本地化人員應該從一開始就加入應用開發團隊,與 App 開發人員並肩工作,分享 App 設計知識,並通過定期反饋循環切分主題。現在是打破孤島的時候了:所有利益相關者都應該在一個敏捷、迭代的框架中一起工作,該框架允許持續的溝通和較短的反饋循環,從而使您能夠構建“開箱即用”的本地化應用程序 App。

挑戰:App 本地化技術不足

通過使用正確的App 本地化技術,可以輕鬆解決許多 App 本地化挑戰。

為什麼重要:當您沒有合適的工具時,您的工作流程會受到影響——長時間的電子郵件來回成為常態,開發人員花費更多時間追踪應用字符串並將其提供給翻譯人員,應用發布需要更長的時間,因為瓶頸,錯誤未被發現,本地化質量受到影響。

有什麼幫助:使 App 本地化變得像點擊一樣簡單

這些挑戰可以簡單地通過使用專門的App 本地化平台來解決,該平台是從頭開始設計的,考慮了開發人員、產品團隊和本地化人員。

可靠的App 本地化平台通過自動化應用程序字符串數據收集提供最佳工具集,使您能夠將所有本地化項目集中在一個工作區中,通過將所有任務和請求分組在一個地方來促進翻譯管理,與應用程序開發工具集成,推送通知自動等等。

App 本地化工具

投資 App 本地化平台(一種旨在優化 App 本地化工作流程的軟件解決方案)是非常值得的。讓我們看看這些平台提供的一些好處和功能。

App 本地化平台的主要功能

通過自動化和集中化簡化 App 本地化流程,一個強大的本地化平台充當一站式商店,具有廣泛的功能,使 App 本地化更快、更容易,例如:

  • 一個單一的協作環境,高管、經理、開發人員、設計師、撰稿人和本地化服務提供商可以在這裡一起工作,並在 App 本地化計劃上保持一致
  • 允許您跨項目重複使用應用字符串和其他內容的翻譯記憶庫,與從頭開始重新翻譯所有內容相比,這可以節省時間和金錢
  • 內置應用術語表,指導 App 本地化工作並確保一致性
  • 用於自動執行 App 本地化任務的工具,例如應用程序字符串提取、屏幕截圖生成、工作流管理、性能監控等
  • 使用有助於在應用發布前減少錯誤的工具自動檢查本地化應用內容的質量
  • 與 Slack 或 Jira 等領先的協作平台集成
  • 支持數十種文件格式、開發框架和編程語言
  • 只需點擊一下即可更新應用程序副本翻譯:借助無線 (OTA) SDK,現代 App 本地化平台應允許應用程序商店即時更新翻譯,這在您的App 具有高度交互性或需要頻繁更新時特別有用.

擁有所有 App 本地化數據的單一來源是提高 App 本地化效率的必備條件。專用的App 本地化平台提供了這一中央解決方案,使其成為您 App 本地化工具箱中的完美工具。

使用 App 本地化平台的主要優勢

您的 App 本地化流程應該適合開發團隊的敏捷工作流程,而 App 本地化平台可以通過以下方式實現:

  • 簡化項目操作:消除手動任務使翻譯過程變得更快、更容易。現在,開發人員不必手動將代碼從副本中分離出來,也不必在翻譯完成後反向執行整個操作。
  • 從單個儀表板啟用整個項目概覽:依靠強大的功能和無數的集成,您可以從一個屏幕方便地跟踪項目進度、語言版本、翻譯訂單、它們的成本等等。
  • 集中信息以實現更高效的項目管理:當您將所有文件、圖像、翻譯字符串和說明放在一個地方時,每個人都在同一頁面上工作,並且員工的家用計算機上沒有關鍵文件——這可以防止錯誤並簡化管理項目簡單了很多。
  • 確保跨團隊協作:管理、開發、設計、文案撰寫、本地化和應用程序測試只是通常從事 App 本地化工作的幾個部門;有了 App 本地化平台,瓶頸很容易避免,每個人都可以隨時了解 App 本地化的最新進展,本地化工作不再是孤立的。
  • 降低 App 本地化成本:由於生產力的提高,自動化幾乎總是比手動工作流更具成本效益的解決方案。當您的 App 本地化平台涵蓋最繁瑣的流程時,每個團隊花在日常任務上的時間就會減少,而花在完善工作上的時間就會更多。
  • 保持一致性:專用的App 本地化解決方案包括強大的一致性檢查工具,例如詞彙表、翻譯記憶庫和歷史日誌,可防止不一致的內容出現在您的應用程序中。
  • 保證發布後的應用程序更新也已本地化:自動化工作流程可防止在 App 本地化過程中忽略重要應用程序更新的風險——每個利益相關者都可以在需要翻譯、審查或更新應用程序字符串時收到更新。
  • 提高 App 本地化質量:借助翻譯人員的自動 UI 屏幕截圖等功能,您可以確保正確本地化可能含糊不清的應用字符串,以避免用戶混淆和應用拒絕。
  • 促進預算和進度計劃以及 ROI 跟踪:當您在一個地方進行 App 本地化管理時,財務和項目跟踪將變得方便和容易——這使得預算和計劃 App 本地化成為一項簡單的任務。
  • 加快上市時間:與手動執行 App 本地化工作相比,專用的App 本地化平台可以節省時間和精力;因此,您的App 可以更快地覆蓋全球受眾。

所有這一切都意味著可以更快、更輕鬆地完成 App 本地化,而不會浪費時間或出現可能損害用戶體驗和應用程序成功的翻譯錯誤。

App 本地化提示:如何本地化您的App

現在我們已經涵蓋了戰略考慮並預先解決了一些 App 本地化挑戰,讓我們整合 App 本地化最佳實踐。我們將以下提示分為不同的區域,一方面可以幫助您避免可能代價高昂的錯誤,另一方面可以幫助您設置內置於應用程序開發工作流程中的本地化流程。

App 國際化:為本地化構建您的App 應用程序

將一個 App 變成一個完全本地化的、面向全球市場的應用程序,需要在應用程序開發階段進行準備工作。

此步驟稱為國際化——開發一款可以適應任何市場並在任何市場上運行的移動應用程序的過程,而無需在發布後更改代碼或進行 UI 自定義。

需要儘早考慮國際化的一些常見移動應用程序功能包括:

  • 將用戶界面字符串從代碼移動到資源文件中:在部署代碼之前將應用程序字符串存儲在資源文件中,允許本地化團隊訪問這些文件以便稍後進行翻譯,而無需對代碼本身進行更改。
  • 不對日期、時間、數字和貨幣格式進行硬編碼:當開發人員使用特定於一種語言的格式對應用程序進行硬編碼時,就會產生問題。為避免這種情況,日期、時間、數字和貨幣格式應存儲在變量中,這些變量可用於根據設備的區域設置在運行時動態構建字符串。確保每個人都了解如何為不同的區域設置這些項目的格式,並且格式符合用戶期望。
  • 迎合不同的多元化規則:這似乎是一個小細節,但應用程序開發人員需要記住構建應用程序字符串,以便他們能夠適應多元化。每種語言的複數形式都不同,應用程序需要注意這一點,例如應用程序通知或可能顯示多個項目的錯誤消息。
  • 跨移動平台(iOS 和 Android)合併相同的鍵:為避免重複本地化工作並使 App 本地化任務易於管理,開發人員可以避免在兩個平台上創建相同的應用程序文本——而不是生成兩次應用程序字符串,他們可以創建一組共享的適用於 iOS 和 Android 的合併應用程序文本。
  • 使用Unicode UTF-8編碼: Unicode UTF-8是一個可以代表世界上所有語言的標準。在應用程序開發期間使用它將使您的應用程序能夠支持比其他方式更多的腳本,從而支持更多的語言。

應用程序用戶界面(佈局和設計注意事項)

UI 設計也應該儘早考慮本地化。如果應用程序 UI 元素不靈活,應用程序將很難本地化。應用程序屏幕佈局應適合所有類型的語言,而不僅僅是一種或兩種情況(經常發生)。

全球應用程序的一些最佳 UI 設計實踐包括:

  • 保持應用設計的靈活性以適應不同的語言:跨語言的文本擴展意味著設計人員應該依靠靈活的像素尺寸和百分比測量來使應用的 UI 順利調整大小。
  • 適應不同的語言方向:確保您的應用支持從右到左 (RTL) 閱讀的語言。語言方向的改變會影響從按鈕放置位置到導航流程的所有內容,而您最不希望看到的是本地化完成後的設計損壞或功能問題。
  • 將您的應用程序設計工具與本地化平台集成:通過將 Figma 或 Sketch 等設計工具與應用程序本地化平台進行開箱即用的集成,可以在開發過程的早期發現設計中斷。這避免了代價高昂的錯誤,並使應用程序本地化更加容易。

應用文案翻譯

應用程序開發和設計完成後,撰稿人和本地化人員就該開始處理內容和文案了。

以下是您可以採取的一些措施,讓您的團隊更輕鬆地撰寫文案和翻譯文案:

  • 使用屏幕截圖為翻譯人員提供更多上下文:脫離上下文的 UI 元素對於翻譯人員來說變得模棱兩可是很常見的。他們可能需要花更多時間詢問應用程序開發人員以澄清某些應用程序功能,這阻礙了應用程序本地化過程。您可以通過添加為翻譯人員提供上下文的應用程序屏幕截圖,預先清空您的應用程序中任何模棱兩可的術語,以便他們更好地了解應用程序行為。
  • 通過使用翻譯記憶庫和詞彙表確保一致性:當您利用本地化平台的翻譯記憶庫功能時,本地化團隊可以通過重複使用已翻譯的文本片段來避免文本之間的不一致。詞彙表可以進一步幫助您在整個應用程序中保持統一的本地化風格,這對品牌聲音和用戶體驗產生了奇蹟。

應用圖片本地化

視覺資產在應用程序本地化中也發揮著重要作用。例如,當用戶在手機上瀏覽應用商店列表時出現的應用商店橫幅圖像能夠提高應用下載率。

您的目標應該是為每個應用市場本地化圖像,以確保它們從競爭對手中脫穎而出並被當地人注意到。

考慮:

  • 將文本與圖像分開:如果您避免在圖形中放置文本,本地化過程將會更加容易和高效——如果您的圖像(例如應用商店中的應用屏幕截圖)顯示的源文本沒人能理解或影響用戶體驗這與您在本地化屏幕上看到的不同。相反,創建一個可編輯的文本層是個好主意,應用程序開發人員可以使用它在運行時生成應用程序字符串。
  • 驗證圖像的文化充分性:您在應用內和應用商店使用的圖像需要適合併代表每個市場。例如,酒店預訂應用程序的加勒比度假勝地橫幅圖片如果以混凝土叢林為特色,就不會讓觀眾感到非常受歡迎。

應用程序本地化測試和質量保證 (QA)

一旦您的字符串被翻譯並返回您的資源,就該將所有內容移回您的應用程序中了。雖然您可能會認為這是您的本地化過程的結束,但如果您未能檢查您的應用程序是否有錯誤,稍後可能會出現問題。

您可以採取以下幾個步驟來最大程度地降低這種風險:

  • 執行語言測試:實施嚴格的語言測試以確保您的內容沒有問題是在將您的應用程序推送到用戶手中之前修復錯誤的最佳方法。您可能會發現一些未翻譯的應用字符串、翻譯後的 UI 元素在上下文中沒有意義等。
  • 運行功能本地化測試和生產前 QA:運行應用程序本地化測試以查看您的應用程序在其他語言和位置的外觀和感覺也很關鍵。有時,意外的問題會突然出現,比如佈局不正確。

應用商店優化(ASO)和本地化

為了充分利用應用商店的曝光率,針對應用商店的搜索優化您的產品是個好主意。應用商店優化 (ASO)是為應用商店優化應用標題、關鍵字、屏幕截圖、應用描述等的過程。

對於全球 App 應用程序,ASO 需要在每種語言中從頭開始執行。第一步是找到每個區域中最流行的搜索詞,並根據需要調整App的原始標題、描述和其他相關部分。

下一步是考慮不同的應用商店如何處理優化。一個例子是 Apple 的 App Store 中的關鍵字字段有 100 個字符的限制。

另一個例子是 Google Play 為用戶提供了比 App Store 更完整的視覺圖片:頁面頂部突出的特色圖片後面是圖標、評級、簡短描述,屏幕截圖庫位於折疊。因此,如果您要針對 Android 本地化您的應用程序,則這些元素需要最大程度的本地化工作。

讓我們看一下在應用商店本地化方面需要您考慮的一些因素。

關鍵詞

關鍵詞是吸引應用用戶注意力的主要手段。將關鍵詞逐字翻譯成每種應用商店語言通常不是最好的應用本地化策略——因為在線搜索在很大程度上受文化和語言的影響。

明智的做法是針對每個市場從零開始進行關鍵詞研究。這樣,您可以確保應用商店用戶在使用他們的語言搜索相關詞或短語時會找到您的應用。

元數據

為每個應用商店優化應用元數據有助於提高 App 可見度、下載量、評級和評論——這是實現應用商店收入最大化的重要一步。

您需要本地化應用程序標題和應用程序說明,以便它們出現在所有相關區域的應用程序商店中,並迫使用戶下載您的App。

截圖

您是否在應用商店資產中包含了屏幕截圖?如果是這樣,它們也需要本地化和調整。應用程序屏幕截圖是一個寶貴的機會,可以幫助您讓應用程序受到關注並以最佳方式展示您的應用程序,因此確保本地用戶能夠理解他們在屏幕截圖中看到的內容至關重要。

圖標

當您為 Android 和 iOS 本地化您的移動應用程序時,請考慮您的圖標以及圓邊(iOS 應用程序圖標)和方形底部(Android 應用程序圖標)的外觀。

此外,停止思考圖標本身在文化上是否合適。例如,雖然“豎起大拇指”的標誌幾乎被普遍接受,但在伊朗,它被認為是淫穢的。

位置信息

如果您的App是特定於位置的(例如,Cabify Argentina 與 Cabify Spain),最好在相關位置添加位置信息(例如城市或地區名稱),以幫助應用商店在用戶搜索您的App時更好地為您的App編制索引按位置的應用程序。

用戶生成內容

您不想忽視App評級和評論——它們可以決定App下載的成敗。用戶評分和App評論對於App的可發現性、排名、知名度和採用率很重要,因此請確保它們在各個市場中本地化。

視頻內容

如果您計劃在應用商店的某個地方包含視頻內容,您還需要本地化App視頻資產。

應用商店中的本地化App視頻可以幫助訪問者了解您的App的外觀、工作原理以及他們可能想要下載它的原因。

測量單位

許多應用程序都包含測量單位。無論是幫助您跟踪減掉的磅數或千克數的減肥應用程序App,還是以英寸為單位顯示降雨量的天氣應用程序App,應用程序用戶都希望這些測量單位有意義。

App 本地化可以像您做的那樣簡單

如果您希望在核心市場之外擴展應用程序使用和應用程序知名度,App 本地化就是答案。

專用的App本地化平台可以端到端地平滑和自動化您的App本地化流程,使您可以輕鬆地:

  • 通過與應用程序的源代碼存儲庫集成來導入和導出可本地化的字符串
  • 讓所有相關部門在一個保護傘下協作
  • 管理團隊並監控他們的進度
  • 通過屏幕截圖和實時預覽為翻譯人員提供上下文
  • 利用翻譯記憶庫、詞彙表和 QA 功能確保准確性和一致性
  • 維護應用程序資產的所有語言版本

一旦您決定繼續進行,您為改進App本地化工作流程而採取的任何措施都可以幫助您節省大量時間和資源。這最終會影響本地化工作的成功。畢竟,您在目標市場推出的速度越快,本地化的準確性越高,您可能會吸引和取悅更多的App用戶。

Read More

網站轉讓

因合伙人團隊解散,無力經營,現轉讓網站,請聯係我們 @Toyli2012,飞机号