Overview 概要
Note 注意
This sample code project is associated with WWDC21 session 10109: What’s New in Foundation. この見本コードプロジェクトは、WWDC21セッション10109: What’s New in Foundationと関連します。
The Caffé sample app presents a list of menu items — each of which are available in a variety of sizes — that users can order from a café. In presenting the various food items and helping to prepare an order, the app uses various Foundation APIs to localize and stylize the app’s text: Caffé見本アプリは、ユーザが café から注文できるメニュー項目 — そのそれぞれは様々なサイズで利用可能です — からなるあるリストを提示します。様々な食品項目を提示することおよび注文するのを助けることにおいて、アプリは様々なFoundation APIを使ってアプリのもつテキストをローカライズしたり体裁を整えたります:
Format
-based formatting customizes the display of currency values, dates and times, and lists of strings.Style Format
基盤の書式設定は、通貨値それら、日付と時刻それら、そして文字列のリストそれらの表示をカスタマイズします。Style Attributed strings allow the app to easily create styled text with Markdown for display in SwiftUI views. The app also uses localized attributed strings to build strings at runtime, even when the word order changes in different languages. 属性付き文字列は、アプリにスタイル付きテキストをMarkdownで簡単に作成させます、SwiftUIビューにおいて表示するために。アプリはまた、ローカライズされた属性付き文字列を使って文字列を実行時に組み立てます、たとえ単語順序がさまざまな異なる言語において変わる時でさえ。
Automatic grammar agreement handles localization situations when strings need to adjust at runtime to match grammatical gender or number in certain languages. 自動文法一致(ある語が別の語に応じて屈折(inflect 語形変化)することを一致(agreement)という)は、さまざまなローカライゼーション状況を取り扱います、文字列それらが実行時に調節を行って文法的性(文法性、文法的性別)や数を特定言語に適合させなければならない時に。
Use Formatters to Format Strings at Runtime フォーマッタを使って文字列を実行時に書式設定する
When the app launches, the user can choose one of several foods to add to their order. When the user chooses a food item, a new view shows the item’s ingredients and the available sizes with corresponding prices. アプリが起動する時、ユーザはいくつかの食品を選んで自身の注文に加えます。ユーザがある食品項目を選ぶ時、新しいビューがその項目の原材料と利用可能なサイズを該当する価格とともに示します。
The ingredient list shows an example of formatting a list of items, using the formatted(_:)
method defined on the Swift Sequence
type. It starts with the an array of ingredients
defined by the Food
type. In Food
, the ingredient
variable takes the ingredient strings, maps each to a localized string, and then uses the formatted(_:)
method to create a comma-separated list. By adding the List
list type List
as a format style parameter, the formatter places an “and” (or its localized equivalent) before last member of the list.
原材料リストは、いくつかの項目からなるリストを書式設定する例を、SwiftのSequence
型上で定義されるformatted(_:)
メソッドを使って示します。それは、ingredients
(原材料それら)からなるある配列で開始します、それはFood
型で定義されます。Food
において、ingredient
変数は原材料文字列それらをとり、それぞれをローカライズされた文字列へとマップして、それからformatted(_:)
メソッドを使ってコンマ区切りリストを作成します。List
リスト型をList
に書式設定形式パラメータとして加えることによって、フォーマッタは “and”(またはそれのローカライズされた同等物)をリストの最後の項の前に置きます。
In English, the ingredient text reads “Our pizza is made from: prosciutto, cheese, flour, and tomatoes.” In Spanish, the list reads “Nuestro pizza está hecho de: prosciutto, queso, harina y tomates.” 英語では、原材料テキストは “Our pizza is made from: prosciutto, cheese, flour, and tomatoes” と読めます。スペイン語では、リストは “Nuestro pizza está hecho de: prosciutto, queso, harina y tomates” と読めます。
The app also uses string formatters to present the price of each item, as seen here: アプリはまた、文字列フォーマッタを使って各項目の値段を表示します、ここに見られるように:
As with the list of ingredients earlier, the formatted(_:)
method applies directly to the type it formats. In this case, the formatted type is a Decimal
; this type conforms to Swift’s Binary
, which defines the formatted(_:)
method. A Format
parameter indicates that the formatting should format the price as a currency, using U.S. dollars.
前の原材料のリストでのように、formatted(_:)
メソッドはそれが書式設定する型に直接に適用されます。この場合には、書式設定された型はDecimal
です;この型はSwiftのもつBinary
に準拠します、それはformatted(_:)
メソッドを定義します。Format
パラメータは、書式設定は、値段をある通貨として、U.S.ドルを使って、書式設定すべきであることを指し示します。
For more sophisticated formatting needs, some format styles support chaining modifier methods to customize a default style. The Caffé app includes a companion app for Apple Watch that shows the next date when the user is eligible to receive a free coffee. The Date
presented in this view customizes the default date
format style to show only the weekday, hour, and minute:
さらに洗練された書式設定の需要のために、いくつかの書式設定スタイルは、修飾子メソッドの連鎖をサポートすることで省略時のスタイルをカスタマイズします。Caffé アプリは、あるコンパニオンアプリをApple Watchのために含みます、それはユーザが無料コーヒーを受け取る資格がある次回の日付を示します。このビューにおいて提示されるDate
は、省略時のdate
書式設定形式をカスタマイズして、週日、時間、そして分だけを示すようにします。
Use Attributed Strings to Style Text 属性付き文字列を使ってテキストの体裁を整える
The previous listing also uses the attributed
modifier to return an Attributed
. Attributed strings contain text and metadata that applies to ranges of that text. In this case, the attributed string returned by the formatter uses the date
attribute to mark which ranges of text correspond to which parts of the formatted date. This allows the app to find the weekday attribute in the attribute container and change it to an orange foreground color attribute. The SwiftUI view can then use this attribute when styling the watch display.
前のコード出力はまた、attributed
修飾子を使ってAttributed
を返します。属性付き文字列は、テキストとメタデータを含みます、それはそのテキストのいくつかの範囲に適用されます。この場合には、フォーマッタによって返される属性付き文字列は、date
属性を使って、テキストのどの範囲が、この書式設定された日付のどの部分に対応するかを印します。これは、アプリに週日属性を属性コンテナにおいて見つけさせて、それをオレンジ背景色属性へと変えさせます。SwiftUIビューは、それからこの属性をウォッチディスプレイの体裁を整える時に使用できます。
Attributed
is strongly-typed, meaning that all attributes must have defined names and value types. Attributed
defines attributes for Foundation, SwiftUI, AppKit, and UIKit in its Attribute
type. For common inline attributes like emphasis and links, attributed strings support initialization from with Markdown syntax, either in source or in .strings
files. The following entry from the Spanish localization’s Localizable
file shows Markdown formatting for strong emphasis (**
), regular emphasis (_
), and links ([]
for link text, followed by a URL in parentheses):
Attributed
は強く型付けされます、それは全ての属性が名前それらと値型それらを定義されていなければならないことを意味しています。Attributed
は、属性をFoundation、SwiftUI、AppKit、そしてUIKitに対してそれのAttribute
型において定義します。強調およびリンクのような普通のインライン属性に対して、属性付き文字列は、Markdown構文を使うものからの初期化を、ソースにおいてまたは.strings
ファイルにおいていずれでもサポートします。スペイン語ローカライゼーションのもつLocalizable
ファイルからの以下の登録項目は、Markdown書式設定を強い強調(**
)、通常の強調(_
)、そしてリンク(リンクテキストに対する[]
、それに続けて丸括弧の中のURL)に対して示します:
An app can also define custom attributes, as Caffé does with its Rainbow
type, an attribute that indicates a range of text to display in multiple colors. The Caffé app adds this attribute by:
アプリはまたあつらえの属性を定義できます、Caffé がそれのRainbow
型、複数の色で表示するテキストの範囲を指し示すある属性、でするように。Caffé アプリはこの属性を以下によって加えます:
Defining the
Rainbow
as an extension ofAttribute Codable
, and providing the name and value type of the attribute.Attributed String Key Rainbow
をAttribute Codable
の拡張として定義する、そして属性の名前と値の型を提供する。Attributed String Key Extending
Attribute
to define a newScopes Attribute
calledScope Caffe
, whose one member isApp Attributes rainbow
, of typeRainbow
. The app also extendsAttribute Attribute
withScopes caffe
, a variable of theApp Caffe
type, that allows access to the Caffé app’s custom attributes with dynamic member lookup syntax.App Attributes Attribute
を拡張して新しいScopes Attribute
でScope Caffe
と呼ばれるものを定義します、それのあるメンバはApp Attributes rainbow
です、型Rainbow
の。アプリはまたAttribute Attribute
をScopes caffe
、App Caffe
型の可変のもので拡張します、それは Caffé アプリのもつあつらえの属性それらに動的メンバ検索構文でアクセス可能にします。App Attributes Extending
Attribute
to provide a subscript method that takes key paths of typeDynamic Lookup Caffe
. This allows code to use dot syntax when looking up the members ofApp Attributes Caffe
.App Attributes Attribute
を拡張してある添え字メソッドを提供する、それは型Dynamic Lookup Caffe
のキーパスをとるものです。これは、コードにドット構文をApp Attributes Caffe
のメンバを検索する時に使えるようにします。App Attributes
The implementation of Rainbow
uses these attributes by creating an Attributed
and calling a private annotate
method to apply its color attributes.
Rainbow
の実装は、これら属性の使用を、Attributed
を作成することそしてそれの色属性を適用するためにプライベートなannotate
メソッドを呼び出すことによって行います。
To create an Attributed
that uses custom attribute scopes, Caffé uses the init(localized:
initializer, passing the key path to the custom attribute name as the including:
parameter:
To apply a custom attribute in a string, a caller uses the Markdown extension syntax, as seen in the following example, which applies two different values of the rainbow attribute: あつらえの属性をある文字列において適用するには、呼び出し側はMarkdown拡張構文を使います、以下の例で見られるように、それはrainbow属性の2つの異なる値を適用します:
Simplify Localization by Performing Grammar Agreement Automatically ローカライゼーションを文法一致を自動的に実行することによって簡単にする
Some languages’ grammar require that nouns, adjectives, articles, and other parts of speech agree in number or gender with other parts of a sentence. Localized attributed strings can perform this agreement by using a template string to format the values at runtime. いくつかの言語のもつ文法は、名詞、形容詞、冠詞、そしてそのほか話し言葉の一部が、数または性別において文の他の部分と一致することを必要とします。ローカライズされた属性付き文字列は、この一致を実行することができます、テンプレート文字列を使って値それらを実行時に書式設定することによって。
In Caffé, each food’s detail view has a button indicating how many of each item the user has selected to add to their order. The app fills in this button text with the number, size, and food item to add to the order: Caffé において、各食べ物のもつ詳細ビューは、ユーザが選択した、自身の注文に加えることになる各項目がいくつかを指し示しているボタンを持ちます。アプリは、このボタンテキストを、注文に加えることになる個数、サイズ、そして食べ物項目で満たします:
The syntax ^[text](inflect:
tells the generated attributed string to inflect the string, meaning to perform automatic grammar agreement on the range of text within the square braces. This process takes into account the value of any numeric substitutions and grammatical gender of string substitutions. In English, this causes the food name to pluralize when quantity
is not equal to 1
.
構文^[text](inflect:
は、生成された属性付き文字列にその文字列を屈折(語形変化)させるように伝えます、自動的に文法一致を角括弧内のテキストの範囲上で実行しようとして。この処理は、あらゆる数値的置換および文字列置換の文法的性の値を考慮に入れます。英語では、これは食べ物名が複数形になることをquantity
が1
と等しくない場合に引き起こします。
In Spanish, the localized string in the .strings
file uses the parameter reordering syntax to place the noun before the adjective, like the following:
スペイン語では、.strings
ファイルの中のローカライズされた文字列は、パラメータ再配列構文を使って名詞を形容詞の前に置きます、以下のように:
When the automatic grammar engine inflects the generated string for Spanish, it pluralizes the food name, as it does in English. In Spanish, it also adjusts the adjective (food
) to match the number of quantity
and the grammatical gender of food
. For example, one small salad becomes “1 ensalada pequeña” in Spanish, while two small salads is “2 ensaladas pequeñas”. In both cases, the grammar engine changes the adjective “pequeño” to match the feminine gender of “ensalada”.
自動文法エンジンがその生成された文字列をスペイン語に対して屈折(語形変化)させる時、それは食べ物名を複数形にします、それが英語においてするように。スペイン語では、それはまた形容詞を調整して(food
)、quantity
の数そしてfood
の文法的性に合わせます。例えば、one small salad(1つの小さなサラダ)は “1 ensalada pequeña” にスペイン語ではなります、一方で two small salads(2つの小さなサラダ)は “2 ensaladas pequeñas” です。両方の場合において、文法エンジンは形容詞 “pequeño” を変化させて “ensalada” の女性に合わせます。
In some languages, an app may need to provide part-of-speech information to the inflection engine.
いくつかの言語では、アプリは品詞情報を屈折エンジンに提供する必要があるかもしれません。
This happens in English, where the words “sandwich” and “juice” are both a noun and a verb. In Spanish, the food size terms “grande” and “enorme” can be used as both adjectives and nouns. The inflection engine logs a warning when it encounters this type of ambiguity.
スペイン語では、食べ物のサイズ用語 “grande” と “enorme” は、形容詞と名詞の両方として使われます。屈折エンジンは、それがこの種の多義性に出くわす時に警告を記録します。
To clarify intent, the inflection engine accepts a grammar markup that wraps the substitution with the syntax ^[…](morphology: {…})
and provides part-of-speech information. The following entry from the English strings file shows an example of this disambiguation:
英語の strings ファイルからの以下の登録項目は、この明確化の例を示します: