------------------------------------------------------------------------------
--                                                                          --
--                         GNAT RUN-TIME COMPONENTS                         --
--                                                                          --
--                           A D A . L O C A L E S                          --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 2010-2023, Free Software Foundation, Inc.         --
--                                                                          --
-- This specification is derived from the Ada Reference Manual for use with --
-- GNAT.  In accordance with the copyright of that document, you can freely --
-- copy and modify this specification,  provided that if you redistribute a --
-- modified version,  any changes that you have made are clearly indicated. --
--                                                                          --
------------------------------------------------------------------------------

package Ada.Locales is
   pragma Preelaborate (Locales);
   pragma Remote_Types (Locales);

   --  A locale identifies a geopolitical place or region and its associated
   --  language, which can be used to determine other internationalization-
   --  related characteristics. The active locale is the locale associated with
   --  the partition of the current task.

   type Language_Code is new String (1 .. 3)
      with Dynamic_Predicate =>
         (for all E of Language_Code => E in 'a' .. 'z');
   --  Lower-case string representation of an ISO 639-3 alpha-3 code that
   --  identifies a language.

   type Country_Code is new String (1 .. 2)
      with Dynamic_Predicate =>
         (for all E of Country_Code => E in 'A' .. 'Z');
   --  Upper-case string representation of an ISO 3166-1 alpha-2 code that
   --  identifies a country.

   Language_Unknown : constant Language_Code := "und";
   Country_Unknown  : constant Country_Code := "ZZ";

   function Language return Language_Code;
   --  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.

   function Country return Country_Code;
   --  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.

end Ada.Locales;
