@@ -19,7 +19,7 @@ defmodule Cldr.LocaleDisplay do
1919 @ omit_script_if_only_one false
2020
2121 @ type display_options :: [
22- { :compound_locale , boolean ( ) } ,
22+ { :language_display , :standard | :dialect } ,
2323 { :prefer , atom ( ) } ,
2424 { :locale , Cldr.Locale . locale_name ( ) | Cldr.LanguageTag . t ( ) } ,
2525 { :backend , Cldr . backend ( ) }
@@ -45,10 +45,9 @@ defmodule Cldr.LocaleDisplay do
4545
4646 ## Options
4747
48- * `:compound_locale` is a boolean indicating
49- if the combination of language, script and territory
50- should be used to resolve a language name.
51- The default is `true`.
48+ * `:language_display` determines if a language
49+ is displayed in `:standard` format (the default)
50+ or `:dialect` format.
5251
5352 * `:prefer` signals the preferred name for
5453 a subtag when there are alternatives.
@@ -75,24 +74,24 @@ defmodule Cldr.LocaleDisplay do
7574 iex> Cldr.LocaleDisplay.display_name "en"
7675 {:ok, "English"}
7776
78- iex> Cldr.LocaleDisplay.display_name "en-US"
79- {:ok, "American English"}
80-
81- iex> Cldr.LocaleDisplay.display_name "en-US", compound_locale: false
77+ iex> Cldr.LocaleDisplay.display_name "en-US", language_display: :standard
8278 {:ok, "English (United States)"}
8379
84- iex> Cldr.LocaleDisplay.display_name "en-US-u-ca-gregory-cu-aud"
80+ iex> Cldr.LocaleDisplay.display_name "en-US", language_display: :dialect
81+ {:ok, "American English"}
82+
83+ iex> Cldr.LocaleDisplay.display_name "en-US-u-ca-gregory-cu-aud", language_display: :dialect
8584 {:ok, "American English (Gregorian Calendar, Currency: A$)"}
8685
87- iex> Cldr.LocaleDisplay.display_name "en-US-u-ca-gregory-cu-aud", locale: "fr"
86+ iex> Cldr.LocaleDisplay.display_name "en-US-u-ca-gregory-cu-aud", locale: "fr", language_display: :dialect
8887 {:ok, "anglais américain (calendrier grégorien, devise : A$)"}
8988
9089 iex> Cldr.LocaleDisplay.display_name "nl-BE"
91- {:ok, "Flemish"}
92-
93- iex> Cldr.LocaleDisplay.display_name "nl-BE", compound_locale: false
9490 {:ok, "Dutch (Belgium)"}
9591
92+ iex> Cldr.LocaleDisplay.display_name "nl-BE", language_display: :dialect
93+ {:ok, "Flemish"}
94+
9695 """
9796 @ spec display_name ( Cldr.Locale . locale_reference ( ) , display_options ( ) ) ::
9897 { :ok , String . t ( ) } | { :error , { module ( ) , String . t ( ) } }
@@ -110,7 +109,7 @@ defmodule Cldr.LocaleDisplay do
110109
111110 def display_name ( % LanguageTag { } = language_tag , options ) do
112111 { in_locale , backend } = Cldr . locale_and_backend_from ( options )
113- compound_locale? = ! ! Keyword . get ( options , :compound_locale , true )
112+ language_display = Keyword . get ( options , :language_display , :standard )
114113 prefer = Keyword . get ( options , :prefer , :default )
115114
116115 with { :ok , in_locale } <- Cldr . validate_locale ( in_locale , backend ) do
@@ -121,16 +120,18 @@ defmodule Cldr.LocaleDisplay do
121120
122121 match_fun = & language_match_fun ( & 1 , & 2 , display_names . language )
123122
124- case first_match ( language_tag , match_fun , @ omit_script_if_only_one , compound_locale? , prefer ) do
123+ case first_match ( language_tag , match_fun , @ omit_script_if_only_one , language_display , prefer ) do
125124 { language_name , matched_tags } ->
125+ language_name = replace_parens_with_brackets ( language_name )
126+ language_tag = merge_extensions_and_private_use ( language_tag )
127+
126128 subtag_names =
127129 language_tag
128130 |> subtag_names ( @ basic_tag_order -- matched_tags , display_names , prefer )
129131 |> List . flatten ( )
132+ |> Enum . map ( & replace_parens_with_brackets / 1 )
130133 |> join_subtags ( display_names )
131134
132- language_tag = merge_extensions_and_private_use ( language_tag )
133-
134135 extension_names =
135136 @ extension_order
136137 |> Enum . map ( & Cldr.DisplayName . display_name ( Map . fetch! ( language_tag , & 1 ) , options ) )
@@ -165,10 +166,9 @@ defmodule Cldr.LocaleDisplay do
165166
166167 ## Options
167168
168- * `:compound_locale` is a boolean indicating
169- if the combination of language, script and territory
170- should be used to resolve a language name.
171- The default is `true`.
169+ * `:language_display` determines if a language
170+ is displayed in `:standard` format (the default)
171+ or `:dialect` format.
172172
173173 * `:prefer` signals the preferred name for
174174 a subtag when there are alternatives.
@@ -195,16 +195,16 @@ defmodule Cldr.LocaleDisplay do
195195 iex> Cldr.LocaleDisplay.display_name! "en"
196196 "English"
197197
198- iex> Cldr.LocaleDisplay.display_name! "en-US"
198+ iex> Cldr.LocaleDisplay.display_name! "en-US", language_display: :dialect
199199 "American English"
200200
201- iex> Cldr.LocaleDisplay.display_name! "en-US", compound_locale: false
201+ iex> Cldr.LocaleDisplay.display_name! "en-US"
202202 "English (United States)"
203203
204- iex> Cldr.LocaleDisplay.display_name! "en-US-u-ca-gregory-cu-aud"
204+ iex> Cldr.LocaleDisplay.display_name! "en-US-u-ca-gregory-cu-aud", language_display: :dialect
205205 "American English (Gregorian Calendar, Currency: A$)"
206206
207- iex> Cldr.LocaleDisplay.display_name! "en-US-u-ca-gregory-cu-aud", locale: "fr"
207+ iex> Cldr.LocaleDisplay.display_name! "en-US-u-ca-gregory-cu-aud", locale: "fr", language_display: :dialect
208208 "anglais américain (calendrier grégorien, devise : A$)"
209209
210210 """
@@ -229,7 +229,7 @@ defmodule Cldr.LocaleDisplay do
229229
230230 # If matching on the compound locale then we
231231 # don't need to take any action
232- defp first_match ( language_tag , match_fun , omit_script_if_only_one? , true , prefer ) do
232+ defp first_match ( language_tag , match_fun , omit_script_if_only_one? , :dialect , prefer ) do
233233 case Cldr.Locale . first_match ( language_tag , match_fun , omit_script_if_only_one? ) do
234234 { language_name , matched_tags } ->
235235 { get_display_preference ( language_name , prefer ) , matched_tags }
@@ -244,7 +244,7 @@ defmodule Cldr.LocaleDisplay do
244244 # its generated as a subtag
245245 @ reinstate_subtags [ :territory , :script ]
246246
247- defp first_match ( language_tag , match_fun , omit_script_if_only_one? , false , prefer ) do
247+ defp first_match ( language_tag , match_fun , omit_script_if_only_one? , :standard , prefer ) do
248248 language_tag = Enum . reduce ( @ reinstate_subtags , language_tag , fn key , tag ->
249249 Map . put ( tag , key , nil )
250250 end )
@@ -288,11 +288,17 @@ defmodule Cldr.LocaleDisplay do
288288 defp get_display_name ( locale , display_names , subtag , prefer ) do
289289 case Map . fetch! ( locale , subtag ) do
290290 [ _ | _ ] = subtags ->
291- Enum . map ( subtags , fn value -> get_in ( display_names , [ subtag , value ] ) end )
291+ Enum . map ( subtags , fn value ->
292+ display_name = get_in ( display_names , [ subtag , value ] ) || value
293+
294+ # The ICU test data does this. Its not great
295+ # but it matches the output from ICU.
296+ if display_name == "FONIPA" , do: "fonipa" , else: display_name
297+ end )
292298 |> Enum . sort ( )
293299
294300 subtag_value ->
295- get_in ( display_names , [ subtag , subtag_value ] )
301+ get_in ( display_names , [ subtag , subtag_value ] ) || subtag_value
296302 end
297303 |> get_display_preference ( prefer )
298304 end
@@ -344,6 +350,8 @@ defmodule Cldr.LocaleDisplay do
344350 value
345351 |> String . replace ( "(" , "[" )
346352 |> String . replace ( ")" , "]" )
353+ |> String . replace ( "(" , "[" )
354+ |> String . replace ( ")" , "]" )
347355 end
348356
349357 # Joins field values together using the
0 commit comments