View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

WWDC25に戻る

  • 概要
  • トランスクリプト
  • コード
  • アプリの多言語体験の向上

    多言語ユーザーにシームレスな体験を提供しましょう。ユーザーが好みの言語を使用できるようにアプリを最適化するには、Language Discoveryが役立ちます。双方向テキストで複数の範囲を選択するためのNatural Selectionなど、右から左に書く言語をサポートする高度な機能について説明します。また、アプリで多言語シナリオをサポートする際のベストプラクティスも紹介します。

    関連する章

    • 0:00 - イントロダクション
    • 3:57 - Language Discovery
    • 8:43 - 別のカレンダー
    • 9:29 - 双方向テキスト
    • 19:40 - 次のステップ

    リソース

    • Human Interface Guidelines: Right to left
    • Internationalization and Localization Guide
    • Language Introspector
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC25

    • Code Along:SwiftUIのAttributedStringを使って優れたテキスト体験を実現

    WWDC24

    • 多言語対応アプリの構築

    WWDC22

    • Get it right (to left)(右から左方向への文字体)
  • このビデオを検索

    مرحبا!(Marhaba) Omarです 本日は アプリの多言語体験を 向上させる方法を紹介でき とても嬉しく思います 私たちは多言語が飛び交う世界に 暮らしています いまや 皆さんはアプリ本体に加えて 誰もがどこでも使えるという体験も 構築するようになりました ソーシャルアプリを シンガポールや東南アジア向けに 開発する場合も 生産性ツールを ロンドンやヨーロッパ地域の リモートチーム向けに開発する場合も ベイルートやアラブ世界向けに アプリを作成する場合も 言語は 画面の表示以外でも 重要な役目を果たしています 文化であり アイデンティティであり 何百万人もの人々にとって 受け容れられるか 取り残されるかの 違いを生み出す源でもあります iOS 26では 多くの新機能が導入され より上質の多言語体験を提供します 皆さんもデベロッパとして これらの改善点を活かし よりアクセシブルで 世界で親しまれる アプリを構築できます 新機能をいくつか紹介します iOS 26では アラビア語話者のための Arabizi表記変換キーボードが登場します アラビア語の単語を ラテン文字で入力すると キーボードが自動的に アラビア文字で入力します 英語またはフランス語キーボードでの 入力に慣れている場合は アラビア語入力が かなり楽になります 表記変換キーボードの機能も 追加して バイリンガル候補を提供します このヒンディー語キーボードで 英語の単語を入力すると iOS 26が自動的に その翻訳を提案します アラビア語と英語の マルチスクリプト バイリンガルキーボードも導入します アラビア語と英語の両方を話せる場合 入力した言語を 自動検出できるようになり どちらの言語でも 入力操作がシンプルになります 最後に 新しい24キーレイアウトの タイ語キーボードの登場で タイ語話者にとって さらに使いやすくなりました 国際化は 世界中の オーディエンスに向けたアプリ構築の 大切な第一歩です Xcode、Foundation API Unicodeのサポートなど Appleが提供する パワフルなツールとテクノロジーにより どの言語を追加するか 不確定の状態であっても 多言語対応のアプリを 簡単に用意できます 国際化のための 新しいツールやAPIを紹介する前に アプリの多言語化に備える際の 基本となる ベストプラクティスを紹介します TextKit2を使えば アプリでの 多言語対応を簡単に実行できます 韓国語やヒンディー語などの 複雑な文字体系を処理でき レイアウトやスタイリングを より詳細に制御できるため どのような言語でも テキストを適切に表示できます TextKit2は双方向テキストでも シームレスに管理できます 後ほど Dannyさんから 双方向テキスト対応の 最新機能をご紹介します Swiftのフォーマッタは 日付、数字、テキストを ユーザーの言語や地域に合わせて 表示させるのに役立ちます 現地に合わせて カスタムロジックを書かなくとも わずか数行のコードで 通貨から日付まで すべてローカライズできます Swiftには ソフトウェアキーボードから ハードウェアのキーボードまで さまざまな入力モードを管理して 操作をシンプルにするAPIが 多数揃っています たとえば inputAccessoryViewで キーボード上に 直接ビューを配置したり textInputContextIdentifierを設定して 直近の言語やレイアウトを キーボードに 自動で記憶させることができます TextKitやフォーマッタや テキスト入力の詳細については 以下にリンクを記載した 去年のビデオをご覧ください セッションに関連する サンプルコードも入手できます さて ここからは アプリの多言語体験を向上させる 新しいAPIが登場します 新機能Language Discoveryを 紹介しましょう アプリでAlternate calendarに 対応する方法を確認し 双方向テキストの処理における 進歩を探ります 最初は Language discoveryです 世界中の何十億人もの人々が 多言語を使っています 多くの地域で 大勢の人が 日常生活で 複数の言語を使用しています Appleでは 優れたアプリこそ 人間の経験全般について 考慮したものであるべきと考えています 自分の言語で アプリを操作できることが とても重要です iOS 26の登場以前 言語を選択するには 設定アプリから 手動で追加する以外にありませんでした 今なら ハードルの高い 作業だと分かります たとえば 自分のiPhoneは 英語に設定しているのですが 母語はアラビア語です 音楽やPodcastは アラビア語で聴いています 英語とアラビア語の両方で ニュースを読み メッセージを送ります iPhoneのユーザーインターフェイスは 英語にしていますが ニュース、音楽、Podcastの おすすめはアラビア語で入手します iOS 26では Siriはパーソナルで積極的で インテリジェントな提案を提供して 言語設定の変更を支援します Siriはオンデバイスの インテリジェンスを使用して iPhoneを英語で 設定していても 入力や音楽やブラウザ閲覧には アラビア語も使うことを認識しています Siriの提案をタップする際 iPhoneの言語をアラビア語に 切り替えて アラビア語と英語の バイリンガルキーボードを追加し ニュース、音楽、Podcastなど 自分の言語から おすすめのコンテンツを要求します 多言語を使用し お勧めのコンテンツを 自分の言語で知りたい 世界中の何百万人ものユーザーが これを体験できます Foundationフレームワークのおかげで Locale.preferredLanguagesを使用して ユーザーの使用言語の リストを取得し アプリの多言語体験を パーソナライズできます Locale.preferredLanguagesを よくご存じなら 言語識別子の配列がStringとして 返されることもご存じでしょう Stringの値は BCP-47言語タグに準拠しています ただし Stringベースの識別子は 処理や操作が難しく 複雑になる可能性があります 今年Appleが導入する Locale.preferredLocalesは これに代えて Locale.preferredLanguagesと比較した 情報のスーパーセットを含む Localeの配列を返します ロケールは イギリス英語やカナダ英語のように 言語と地域の両方を表します 自分のiPhoneの場合 ロケールはレバノンアラビア語です アプリで正しいスペルを表示して 日付や通貨の表示を ユーザーの好みに合わせ よりパーソナルな体験を提供するためにも Localeは必要不可欠です Localeでは 必要に応じて BCP-47、ICU、CLDRなど Stringベースの識別子にアクセスして 識別子の正確な形式を 選択することも可能です Localeに関するさまざまなプロパティにも アクセスできます たとえば numberingSystemを 取得したり localizedString API を使用して 言語や地域に応じた ローカライズ名にアクセスできます Locale.preferredLanguagesは 将来非推奨になる可能性があり Locale.preferredLocalesに 切り替えることをお勧めしています iOS 26では preferredLocalesを 広範囲に使用しています 翻訳アプリでは 長い言語リストを 表示して選択させる代わりに ユーザーの使用言語を 画面上部に表示します カレンダーでは 代替カレンダーを設定してある場合 曜日や月などのUI要素が ユーザーの言語で表示可能になりました そして Apple Musicは preferredLocalesを使用して おすすめや訳詞を ユーザーの言語で提供します これによって多言語体験が さらにパーソナライズされます 翻訳アプリの例は 他の多くのアプリでも体験でき ユーザーは 長いリストで 言語を選ぶ作業から解放されます アプリ体験は preferredLocales APIと Foundationを使って カスタマイズできます

    さっそく翻訳アプリを開いて この体験を共有しましょう 利用可能なロケールオブジェクトから availableLocalesを 取り上げてみましょう matchedLocalesを配列として使い ユーザーのpreferredLocalesを アプリのavailableLocalesとマッチさせます 翻訳アプリのavailableLocalesが ループ処理可能になります 利用可能なロケールが preferredLocalesに含まれているか 1つずつ確認できます マッチするものが見つかったら matchLocalesとbreakに追加できます matchLocalesを使用して 言語に優先順位を付け 簡単にアクセスできるよう リストの一番上に配置します 必要に応じて ここでisEquivalentまたは hasCommonParentを選択できます Language discoveryは アプリを よりパーソナルで自然なものにし 使用言語を確認するステップを 不要にします ユースケースは無限大です 皆さんがアプリでpreferredLocalesを どう使用するか とても楽しみです ここからは Foundationで入手できる 新しい代替カレンダーAPIを 紹介します iOS 26では さまざまな 代替カレンダーが加わりました たとえば グジャラート語や マラーティー語、韓国語などが 追加されています 新しいカレンダーは すべてのプラットフォームで利用できます 既存の 16のカレンダー識別子の他に Calendar.Identifierでアクセスできる 新しいカレンダーを11種類 Foundationフレームワークに 追加しました 本日は 国際化に関する 最新情報をお届けします これまでに Language discoveryと 新しいカレンダー識別子を紹介しました ここからはDannyさんに 引き継いで 双方向テキストに関する 最新情報を紹介してもらいます Omarさん ありがとう Xin chào(こんにちは) Dannyです iOSとiPadOSの 双方向テキストに関する 最新情報をご紹介できることを 嬉しく思います これらのイノベーションは アプリの多言語体験を 大幅に強化する可能性を秘めています 双方向テキストについて 包括的に理解するには 「Get it right (to left)」セッションを ご覧ください まず 双方向テキストの 定義を確認しましょう 英語では テキストは 左から流れて右で終わります このような書字方向を 左から右 またはLTRと表現します ヘブライ語などの言語では テキストは右から流れて 左で終わります このような書字方向を 右から左 またはRTLと表現します LTRとRTLのテキストを組み合わせると 書かれたテキストは双方向になり テキスト選択に大きく影響します 双方向テキストにおける テキスト選択の仕組みを理解するには 表示されるテキストの順序と 保存されたテキストの順序を 比較する必要があります このLTRの例では 文字は書かれた順番どおりに 格納されています RTLテキストの文字も 書かれた順序で格納されます LTRテキストと同じです 違いは テキストの表示方法にあり 右から左に表示されます 右にドラッグして選択しても ストレージ内で 選択方法を反転させて 降順を指定すれば テキストは選択できるため さしあたり問題にはなりません これでも ストレージ内で選択された 単一の連続した範囲は 実際に見えている選択範囲と 一致しています 問題は LTRテキストとRTLテキストを 組み合わせるケースです テキストは書かれた順序のままで 保存されていますが 表示するには 複数の方向を 使い分ける必要があります 選択範囲をストレージ内の 単一のテキスト範囲に制限してしまうと テキスト選択は 自然に動作しません たとえば テキスト選択を開始する際に 左から右にドラッグして 選択範囲を指定すると LTRとRTLの境界をまたぐため 選択範囲とカーソルの 整合が取れなくなります 最初に右側のテキストから 選択を始めるため 選択範囲の途中に 不自然なギャップができてしまいます 表示されたテキストを選択しているつもりでも ストレージで選択を行っているかのように 動作するために このようなことが起こります 画面上のテキストの流れが ストレージ内のテキストと一致しないため 画面上とストレージの両方で 切れ目なく選択することは 不可能です iOS 26では 保存順序に沿って 選択させるのではなく カーソルの動きに沿って 選択できるようになりました したがって 選択ポイントを ドラッグすると その動きに従って選択が行われます これが「Natural Selection」です Natural Selectionは 単一方向テキストと双方向テキスト どちらを選択する場合でも 円滑で一貫性のある テキスト選択体験を可能にします Natural Selectionにより 選択範囲のギャップは非表示になり テキストストレージ内に 隠されるようになりました そのため 単一のselectedRangeではなく 複数のselectedRangeが必要になりました macOSでは NSTextViewは Natural Selectionに対応済みで 選択範囲は 値の配列である NSRangesとして表現されます iOS 18では UITextViewが selectedRangeプロパティ1つで 単一の連続した選択範囲を 表現するだけでした つまり iOS 18では 双方向テキストを すき間なしで自然に選択することは 不可能でした selectedRangeが誤って 実際に選択されていない範囲まで 包含してしまうのが原因です iOS 26では「selectedRanges」という 新しいプロパティが採用され 非連続のNSRanges配列を 表現できるようになりました 単一のselectedRangeプロパティは 将来のリリースで非推奨になります 新しいSwiftUIリッチテキストエディタは Natural Selectionにも対応しており 選択範囲は 型属性付きの文字列インデックスとして 表示されます 「Cook up a rich text experience in SwiftUI with AttributedString」で 詳細をご覧ください 先ほど 双方向テキストを選択したので selectedRangesは選択したテキストを 正確に表すようになりました TextViewストレージからの テキスト削除などのアクションに selectedRangeを利用していた場合は 範囲を誤ってテキストを削除してしまう 可能性があります 今後は selectedRangesを使用して 実際に選択したテキストだけが 削除されるようにしましょう このほか UITextViewDelegateと UITextViewDelegateプロトコルも アップデートされ 単一の範囲ではなく NSRangesである値の配列を 引き取るようになりました これらのメソッドは テキスト入力システムが 必要になるとトリガーされ テキスト入力に応じて 指定された範囲内の テキストを変更します たとえば テキストを選択してから テキストビューに貼り付けると shouldChangeTextInRangesメソッドを 呼び出して 指定した範囲内のテキストが 変更可能であるか ペーストするテキストで置き換える前に デリゲートを確認します 選択範囲は非連続であるため 挿入先の候補は 複数存在します テキスト入力システムは 使用中のキーボードなど さまざまな要因に基づいて 新しいテキストを挿入するため 削除対象の範囲内で 適切な場所を決定します 削除範囲内に テキストを挿入しない場合 デリゲートはfalseを返します editMenuForTextInRangeメソッドの 新しいバージョンも登場します 単一の範囲に代わり 範囲の配列を受け取ることで 返す先の編集メニューに対応する テキストの範囲を より正確に表現できるようになりました selectedRangesの使用に切り替えて 新しいデリゲートメソッドを 実装することにより アプリとNatural Selectionが シームレスに連携できるようになり 双方向テキスト体験を パワーアップできます Natural Selectionのメリットを 最大限に高めるには TextKit2が必要です UITextViewとUITextFieldでは すでにTextKit2が採用されており iOS 26でもNatural Selectionを デフォルトでサポートするようになりました ただし アプリが textView.layoutManagerにアクセスすると テキストエンジンが TextKit1に戻ってしまい Natural Selectionその他の機能が 無効になります layoutManagerが必要な場合は TextKit2のレイアウトマネージャ textView.textLayoutManagerを使用します 次は 書字方向という概念について 説明します 書字方向を理解するには テキストの方向を理解する必要があります テキストの方向とは 連続する単一の範囲内で 文字が流れる方向を意味し 書字方向とは 段落内において テキストが 流れる方向を意味しています 書字方向は テキストの最初のスパンの 向きによって決まります

    たとえば LTRのテキストを 先に書く場合 書字方向は 左から右になります その後で ウルドゥー語のような RTLテキストを入力した場合 テキストはLTRテキストの右側に 表示されます なぜなら 書字方向が 左から右のままになっているからです ウルドゥー語のテキストの入力を続けて ウルドゥー語の文が形成されても 書字方向は変わりません 現段階では 左から右に書くテキストから 書き始めていた場合 右から左に書くテキストを入力しても 書字方向は左から右のままです まだ英語の文であると 見なされているからです ただし 書字方向は テキストの内容に応じて 動的に変更できるようになりました つまり 今年からは ウルドゥー語のテキストの入力を続けて ウルドゥー語の文が形成されると 書字方向が右から左に 切り替わるということです Appleが提供するテキストビューと テキストフィールドを 全プラットフォームで利用している場合 この自動調整はアプリ内で行われます 皆さんのアプリで Appleの提供するテキストビューではなく 独自のテキストエンジンを 使用している場合もあるでしょう その場合は Language Introspector サンプルコードを参照して 新しいAPIを使って アプリで入力中のテキストの内容に応じて 書字方向を決める方法を 確認しましょう 双方向テキストの書字方向を 特定するための この新しい方法が 皆さんのアプリの多言語体験を さらに向上させることを 祈っています このセッションでは 多言語ユーザー向けアプリの 機能強化に役立つ新機能を いくつか紹介しました Language discoveryは 優先する言語を自動検出することで アプリがよりパーソナルで自然な印象を 与えるのに役立ちます 代替カレンダーも追加され 多言語体験を向上させる カスタマイズオプションが増えました iOSとiPadOSで 新たに Natural Selectionを サポートしたことで より多彩なデバイスで アプリをシームレスかつ一貫して 機能させることができ 多言語ユーザーのニーズにも 十分応えられるようになりました 皆さんが 双方向テキストを使って 世界中で友人や家族と チャットできる機会を実現してくださる時を 心から楽しみにしています ご視聴ありがとうございました

    • 5:35 - Language discover

      // Language discovery
      
      let preferredLanguages = Locale.preferredLanguages
      
      let preferredLocales = Locale.preferredLocales
    • 7:49 - Match preferred locales with your app’s available locales

      let preferredLocales = Locale.preferredLocales
      
      // array of available Locale objects to translate from
      let availableLocales = getAvailableLocalesForTranslatingFrom()
      
      var matchedLocales: [Locale] = []
      
      for locale in availableLocales {
          for preferredLocale in preferredLocales {
              if locale.language.isEquivalent(to:
        preferredLocale.language) {
                  matchedLocales.append(locale)
                  break
              }
          }
      }
    • 14:57 - Delete text in ranges

      let ranges = textView.selectedRanges.reversed()
      for range in ranges {
          textView.textStorage.deleteCharacters(in: range)
      }

Developer Footer

  • ビデオ
  • WWDC25
  • アプリの多言語体験の向上
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習とAI
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン