blob: ee57e546494af0e2235db3aded6340a3ac198d23 [file] [log] [blame]
/*
*****************************************************************************************
* Copyright (C) 2014-2015 Apple Inc. All Rights Reserved.
*****************************************************************************************
*/
#ifndef UALOC_H
#define UALOC_H
#include "unicode/utypes.h"
#ifndef U_HIDE_DRAFT_API
/**
* Codes for language status in a country or region.
* @draft ICU 54
*/
typedef enum {
/**
* The status is unknown, or the language has no special status.
* @draft ICU 54 */
UALANGSTATUS_UNSPECIFIED = 0,
/**
* The language is official in a region of the specified country,
* e.g. Hawaiian for U.S.
* @draft ICU 54 */
UALANGSTATUS_REGIONAL_OFFICIAL = 4,
/**
* The language is de-facto official for the specified country or region,
* e.g. English for U.S.
* @draft ICU 54 */
UALANGSTATUS_DEFACTO_OFFICIAL = 8,
/**
* The language is explicitly official for the specified country or region.
* @draft ICU 54 */
UALANGSTATUS_OFFICIAL = 12
} UALanguageStatus;
/**
* UALANGDATA_CODELEN is the maximum length of a language code
* (language subtag, possible extension, possible script subtag)
* in the UALanguageEntry struct.
* @draft ICU 54
*/
#define UALANGDATA_CODELEN 23
/**
* The UALanguageEntry structure provides information about
* one of the languages for a specified region.
* @draft ICU 54
*/
typedef struct {
char languageCode[UALANGDATA_CODELEN + 1]; /**< language code, may include script or
other subtags after primary language.
This may be "und" (undetermined) for
some regions such as AQ Antarctica.
@draft ICU 54 */
double userFraction; /**< fraction of region's population (from 0.0 to 1.0) that
uses this language (not necessarily as a first language).
This may be 0.0 if the fraction is known to be very small.
@draft ICU 54 */
UALanguageStatus status; /**< status of the language, if any.
@draft ICU 54 */
} UALanguageEntry;
/**
* Fills out a provided UALanguageEntry entry with information about the languages
* used in a specified region.
*
* @param regionID
* The specified regionID (currently only ISO-3166-style IDs are supported).
* @param minimumFraction
* The minimum fraction of language users for a language to be included
* in the UALanguageEntry array. Must be in the range 0.0 to 1.0; set to
* 0.0 if no minimum threshold is desired. As an example, as of March 2014
* ICU lists 74 languages for India; setting minimumFraction to 0.001 (0.1%)
* skips 27, keeping the top 47 languages for inclusion in the entries array
* (depending on entriesCapacity); setting minimumFraction to 0.01 (1%)
* skips 54, keeping the top 20 for inclusion.
* @param entries
* Caller-provided array of UALanguageEntry elements. This will be filled
* out with information for languages of the specified region that meet
* the minimumFraction threshold, sorted in descending order by
* userFraction, up to the number of elements specified by entriesCapacity
* (so the number of languages for which data is provided can be limited by
* total count, by userFraction, or both).
* Preflight option: You may set this to NULL (and entriesCapacity to 0)
* to just obtain a count of all of the languages that meet the specified
* minimumFraction, without actually getting data for any of them.
* @param entriesCapacity
* The number of elements in the provided entries array. Must be 0 if
* entries is NULL (preflight option).
* @param status
* A pointer to a UErrorCode to receive any errors, for example
* U_MISSING_RESOURCE_ERROR if there is no data available for the
* specified region.
* @return
* The number of elements in entries filled out with data, or if
* entries is NULL and entriesCapacity is 0 (preflight option ), the total
* number of languages for the specified region that meet the minimumFraction
* threshold.
* @draft ICU 54
*/
U_DRAFT int32_t U_EXPORT2
ualoc_getLanguagesForRegion(const char *regionID, double minimumFraction,
UALanguageEntry *entries, int32_t entriesCapacity,
UErrorCode *err);
/**
* Gets the desired lproj parent locale ID for the specified locale,
* using ICU inheritance chain plus Apple additions (for zh*). For
* example, provided any ID in the following chains it would return
* the next one to the right:
*
* en_US → en → root;
* en_HK → en_GB → en_001 → en → root;
* en_IN → en_GB → en_001 → en → root;
* es_ES → es → root;
* es_MX → es_419 → es → root;
* haw → root;
* pt_BR → pt → root;
* pt_PT → pt → root;
* sr_Cyrl → sr → root;
* sr_Latn → root;
* zh_Hans → zh → zh_CN → root;
* zh_Hant_MO → zh_Hant_HK → zh_Hant → zh_TW → root;
* zh_HK → zh_Hant_HK → zh_Hant → zh_TW → root;
* root → root;
* tlh → root;
*
* @param localeID The locale whose parent to get. This can use either '-' or '_' for separator.
* @param parent Buffer into which the parent localeID will be copied.
* This will always use '_' for separator.
* @param parentCapacity The size of the buffer for parent localeID (including room for null terminator).
* @param err Pointer to UErrorCode. If on input it indicates failure, function will return 0.
* If on output it indicates an error the contents of parent buffer are undefined.
* @return The actual buffer length of the parent localeID. If it is greater than parentCapacity,
* an overflow error will be set and the contents of parent buffer are undefined.
* @draft ICU 53
*/
U_DRAFT int32_t U_EXPORT2
ualoc_getAppleParent(const char* localeID,
char * parent,
int32_t parentCapacity,
UErrorCode* err);
/**
* ualoc_localizationsToUse - map preferred languages to
* available localizations.
* =========================
* BEHAVIOR EXAMPLES
* Each block gives up to 6 sets of available lprojs, and then shows how various
* preferred language requests would be mapped into one of the lprojs in each set.
* The en entriy marked * is currently not working as intended (get just "en"
* instead of the indicated values)
*
* --------
* lproj sets → list1 list2 list3 list4 list5 list6
* zh_CN zh_CN zh_CN zh_Hans zh_CN zh_CN
* zh_TW zh_TW zh_TW zh_Hant zh_TW zh_TW
* zh_HK zh_HK zh_Hant_HK zh_Hans zh_HK
* zh_MO zh_Hant zh_Hans
* zh_Hant
* zh_Hant_HK
* language ↓
* zh zh_CN zh_CN zh_CN zh_Hans zh_Hans zh_Hans
* zh-Hans zh_CN zh_CN zh_CN zh_Hans zh_Hans zh_Hans
* zh-Hant zh_TW zh_TW zh_TW zh_Hant zh_Hant zh_Hant
* zh-Hans-CN zh_CN zh_CN zh_CN zh_Hans zh_CN, zh_CN,
* zh_Hans zh_Hans
* zh-Hans-SG zh_CN zh_CN zh_CN zh_Hans zh_Hans zh_Hans
* zh-Hant-TW zh_TW zh_TW zh_TW zh_Hant zh_TW, zh_TW,
* zh_Hant zh_Hant
* zh-Hant-HK zh_TW zh_HK, zh_HK, zh_Hant_HK, zh_Hant zh_Hant_HK,
* zh_TW zh_TW zh_Hant zh_Hant
* zh-Hant-MO zh_TW zh_HK, zh_MO, zh_Hant_HK, zh_Hant zh_Hant_HK,
* zh_TW zh_HK,zh_TW zh_Hant zh_Hant
* zh-Hans-HK zh_CN zh_CN zh_CN zh_Hans zh_Hans zh_Hans
* zh-CN zh_CN zh_CN zh_CN zh_Hans zh_CN, zh_CN,
* zh_Hans zh_Hans
* zh-SG zh_CN zh_CN zh_CN zh_Hans zh_Hans zh_Hans
* zh-TW zh_TW zh_TW zh_TW zh_Hant zh_TW, zh_TW,
* zh_Hant zh_Hant
* zh-HK zh_TW zh_HK zh_HK, zh_Hant_HK, zh_Hant zh_HK,
* zh_TW zh_Hant zh_Hant_HK,zh_Hant
* zh-MO zh_TW zh_HK zh_MO, zh_Hant_HK, zh_Hant zh_Hant_HK,
* zh_HK,zh_TW zh_Hant zh_Hant_HK,zh_Hant
* --------
* lproj sets → list1 list2 list3 list4 list5 list6
* English en en en en en
* en_AU en_AU en_AU en_AU en_AU
* en_GB en_GB en_GB en_GB en_GB
* en_CA en_CA en_001 en_001
* en_IN en_150
* en_US
* language ↓
* en English en en en en en
* en-US English en en en_US, en en
* en
* en-AU English en_AU, en_AU, en_AU, en_AU,en_GB, en_AU,en_GB,
* en_GB,en en_GB,en en_GB,en en_001,en en_001,en
* en-CA English en en_CA, en_CA, en_001, en_001,
* en en en en
* en-GB English en_GB, en_GB, en_GB, en_GB, en_GB,
* en en en en_001,en en_001,en
* en-IN English en_GB, en_GB, en_IN, en_GB, en_GB,
* en en en_GB,en en_001,en en_001,en
* en-US English en en en_US, en en
* en
* en-FR English en_GB, en_GB, en_GB, en_GB, en_150,en_GB,
* en en en en_001,en en_001,en
* en-IL English en en en en_001, en_001,
* en en
* en-001 English en en en en_001, en_001,
* en en
* en-150 English en_GB, en_GB, en_GB, en_GB, en_150,en_GB,
* en en en en_001,en en_001,en
* en-Latn English en en en en en
* en-Latn_US English en en en_US,* en en
* en
* --------
* lproj sets → list1 list2 list3 list4 list5 list6
* Spanish es es es es es
* es_MX es_419 es_419 es_ES es_ES
* es_MX es_MX es_419
* es_MX
* language ↓
* es Spanish es es es es es
* es-ES Spanish es es es es_ES, es_ES,
* es es
* es-419 Spanish es es_419, es_419, es es_419,
* es es es
* es-MX Spanish es_MX, es_419, es_MX, es_MX, es_MX,
* es es es_419,es es es_419,es
* es-AR Spanish es es_419, es_419, es es_419,
* es es es
* --------
* lproj sets → list1 list2 list3 list4 list5 list6
* Portuguese pt pt pt
* pt_PT pt_BR pt_BR
* pt_PT
* language ↓
* pt Portuguese pt pt pt
* pt-BR Portuguese pt pt_BR, pt_BR,
* pt pt
* pt-PT Portuguese pt_PT, pt_PT, pt
* pt pt
* pt-MO Portuguese pt_PT, pt_PT, pt
* pt pt
* =========================
*
* @param preferredLanguages
* Ordered array of pointers to user's preferred language
* codes (BCP47 style null-terminated ASCII strings), in
* order from most preferred; intended to accept the
* contents of AppleLanguages. Must not be NULL.
* Entries with the following values will be ignored:
* NULL, "", "root", any entry beginning with '-' or '_'.
* @param preferredLanguagesCount
* Count of entries in preferredLanguages.
* @param availableLocalizations
* Unordered array of pointers to identifiers for available
* localizations (lprojs); handles old Apple-style
* identifiers such as "English", as well as currently-
* superseded identifiers such as "no", "tl". Must not
* be NULL.
* @param availableLocalizationsCount
* Count of entries in availableLocalizations.
* @param localizationsToUse
* Caller-provided array to be filled with pointers to
* localizations to use in the availableLocalizations
* array; these are entries from availableLocalizations
* that correspond to the first language in
* preferredLanguages for which there is any entry in
* availableLocalizations that is a reasonable match,
* with the best-matching localization first in
* localizationsToUse, followed by any other possible
* fallback localizations (for example, "en_IN" in
* preferredLanguages might produce { "en_GB, "en" } in
* localizationsToUse). Must not be NULL. This need not
* large enough to accomodate all of the localizations
* that might be returned; it is perfectly reasonable
* (and more efficient) to only provide an array with
* one entry, if that is all that you are planning to use.
* @param localizationsToUseCapacity
* The capacity of localizationsToUse.
* @param status
* A pointer to a UErrorCode to receive any errors.
* @return
* The number of entries filled out in localizationsToUse.
* @draft ICU 55
*/
U_DRAFT int32_t U_EXPORT2
ualoc_localizationsToUse( const char* const *preferredLanguages,
int32_t preferredLanguagesCount,
const char* const *availableLocalizations,
int32_t availableLocalizationsCount,
const char* *localizationsToUse,
int32_t localizationsToUseCapacity,
UErrorCode *status );
#endif /* U_HIDE_DRAFT_API */
#endif /*UALOC_H*/