Skip to main content

A.19 The Package Locales

danger

This Reference Manual output has not been verified, and may contain omissions or errors. Report any problems on the tracking issue

1/3

A locale identifies a geopolitical place or region and its associated language, which can be used to determine other internationalization-related characteristics.

Static Semantics

2/3

The library package Locales has the following declaration:

3/5

package Ada.Locales with Preelaborate, Remote_Types is 4/4

type Language_Code is new String (1 .. 3) with Dynamic_Predicate => (for all E of Language_Code => E in 'a' .. 'z'); type Country_Code is new String (1 .. 2) with Dynamic_Predicate => (for all E of Country_Code => E in 'A' .. 'Z');

4.a/4
discussion

These types are derived from type String so that they can easily be converted to or from type String. That's important if one of these values needs to be input or displayed (via Text_IO, perhaps). We use the predicate to ensure that only possible component values are used. Ada does not allow converting between unrelated types with components that don't statically match, so we cannot declare new types with constrained components if we want conversions to or from type String.

5/3

Language_Unknown : constant Language_Code := "und"; Country_Unknown : constant Country_Code := "ZZ"; 6/3 function Language return Language_Code; function Country return Country_Code; 7/3 end Ada.Locales;

8/3

The active locale is the locale associated with the partition of the current task.

8.a/3
implementation note

Some environments define both a system locale and the locale of the current user. For such environments, the active locale is that of current user if any; otherwise (as in a partition running on a server without a user), the system locale should be used.

9/5

This paragraph was deleted.

10/5

This paragraph was deleted.

11/5

Function Language returns the code of the language associated with the active locale. If the Language_Code associated with the active locale cannot be determined from the environment, then Language returns Language_Unknown. Otherwise, the result is a lower-case string representation of an ISO 639-3:2007 alpha-3 code that identifies a language.

11.a/3
discussion

Some common language codes are: "eng" – English; "fra" – French; "deu" – German; "zho" – Chinese. These are the same codes as used by POSIX systems. We considered including constants for the most common languages, but that was rejected as the likely source of continual arguments about the constant names and which languages are important enough to include.

12/5

Function Country returns the code of the country associated with the active locale. If the Country_Code associated with the active locale cannot be determined from the environment, then Country returns Country_Unknown. Otherwise, the result is an upper-case string representation of an ISO 3166-1:2020 alpha-2 code that identifies a country.

12.a/3
discussion

Some common country codes are: "CA" – Canada; "FR" – France; "DE" – Germany; "IT" – Italy; "ES" – Spain; "GB" – United Kingdom; "US" – United States. These are the same codes as used by POSIX systems. We didn't include any country constants for the same reasons that we didn't include any language constants.

Extensions to Ada 2005

12.b/3

Package Locales is new.

Inconsistencies With Ada 2012

12.c/4

Corrigendum: Types Language_Code and Country_Code are defined with predicates rather than constrained components so that they can be converted to/from type String. This changes the exception raised from Constraint_Error to Assertion_Error if an assignment is attempted with an incorrect value. This could only matter if there is a handler specifically for Constraint_Error surrounding this assignment; as this exception raise is certainly caused by a bug (why would anyone want to use invalid language or country codes?), such a handler seems very unlikely. (In addition, this is a new Ada 2012 package, so there is not likely to be a lot of code using it.)