From 150c8531b99d13cb47f75d3cb255b65034f3eccc Mon Sep 17 00:00:00 2001 From: Chris Pyle Date: Sat, 6 Jul 2024 13:39:59 -0400 Subject: [PATCH 1/3] CLDR-17566 initial text and md files --- .../language-distance-data.txt | 101 +++++++++ docs/site/TEMP-TEXT-FILES/list-formatting.txt | 32 +++ docs/site/TEMP-TEXT-FILES/locale-format.txt | 47 +++++ .../TEMP-TEXT-FILES/localized-gmt-format.txt | 49 +++++ .../math-formula-preferences.txt | 21 ++ .../language-distance-data.md | 199 ++++++++++++++++++ .../design-proposals/list-formatting.md | 66 ++++++ .../design-proposals/locale-format.md | 87 ++++++++ .../design-proposals/localized-gmt-format.md | 100 +++++++++ .../math-formula-preferences.md | 48 +++++ .../MathFormularDir_GoogleMap.PNG | Bin 0 -> 63562 bytes 11 files changed, 750 insertions(+) create mode 100644 docs/site/TEMP-TEXT-FILES/language-distance-data.txt create mode 100644 docs/site/TEMP-TEXT-FILES/list-formatting.txt create mode 100644 docs/site/TEMP-TEXT-FILES/locale-format.txt create mode 100644 docs/site/TEMP-TEXT-FILES/localized-gmt-format.txt create mode 100644 docs/site/TEMP-TEXT-FILES/math-formula-preferences.txt create mode 100644 docs/site/development/development-process/design-proposals/language-distance-data.md create mode 100644 docs/site/development/development-process/design-proposals/list-formatting.md create mode 100644 docs/site/development/development-process/design-proposals/locale-format.md create mode 100644 docs/site/development/development-process/design-proposals/localized-gmt-format.md create mode 100644 docs/site/development/development-process/design-proposals/math-formula-preferences.md create mode 100644 docs/site/images/design-proposals/MathFormularDir_GoogleMap.PNG diff --git a/docs/site/TEMP-TEXT-FILES/language-distance-data.txt b/docs/site/TEMP-TEXT-FILES/language-distance-data.txt new file mode 100644 index 00000000000..bf2e7164217 --- /dev/null +++ b/docs/site/TEMP-TEXT-FILES/language-distance-data.txt @@ -0,0 +1,101 @@ +Language Distance Data +The purpose is to provide a way to match language/locales according to "closeness" rather than just a truncation algorithm. and to allow for the user to specify multiple acceptable languages. The data is designed to allow for an algorithm that can account for the closeness of the relations between, say, tl and fil, or en-US and en-CA. This is based on code that we already use, but expanded to be more data-driven. +For example, if I understand written American English, German, French, Swiss German, and Italian, and the product has {ja-JP, de, zh-TW}, then de would be the best match; if I understand only {zh}, then zh-TW would be the best match. This represents a superset of the capabilities of locale fallback. Stated in those terms, it can have the effect of a more complex fallback, such as: +sr-Cyrl-RS +sr-Cyrl +sr-Latn-RS +sr-Latn +sr +hr-Latn +hr +Note that the goal, as with the rest of CLDR, is for matching written languages. Should we find in the future that it is also important to support spoken language matching in the same way, variant weights could be supplied. +This is related to the current aliasing mechanism, which is used to equate he and iw, for example. It is used to find the best locale ID for a given request, but does not interact with the fallback of resources within the locale-parent chain. It subsumes and replaces the current element (we'd take the current information in those elements and apply it). +Expected Input +a weighted list of desired languages D (like AcceptLanguage) +a weighted list of available languages A (eg supported languages) +In the examples, the weights are given in AcceptLanguage syntax, eg ";" + number in (0.0 to 1.0). The weight 0.0 means don't match at all. Unlike AcceptLanguage, however, the relations among variants like "en" and "en-CA" are taken into account. +In very many cases, the weights will all be identical (1.0). Some exceptions might be: +For desired languages, to indicate a preference. For example, I happen to prefer English to German to French to Swiss German to Italian. So the desired list for me might be {"en-US;q=1", "de;q=0.9", "fr;q=0.85", "gsw;q=0.8", "it;q=0.6"} +For available languages, it can be used to indicate the "quality" of the user experience. Thus if it is known that the German version of a product or site is quite good, but the Danish is substandard, that could be reflected in the weightings. In most cases, however, the available language weights would be the same. +Expected Output +A "best fit" language from A +A measure of how good the fit is +Examples +Input: +desired: {"en-CA;q=1", "fr;q=1"} +available: {"en-GB;q=1", "en-US;q=1"} +threshold: script +Output: +en-US +good +Input: +desired: {"en-ZA;q=1", "fr;q=1"} +available: {"en-GB;q=1", "en-US;q=1", "fr-CA;q=0.9"} +threshold: script +Output: +en-GB +good +Input: +desired: {"de"} +available: {"en-GB;q=1", "en-US;q=1", "fr-CA;q=0.9"} +threshold: script +Output: +en-GB +bad +Internals +The following is a logical expression of how this data can be used. +The lists are processed, with each Q value being inverted (x = 1/x) to derive a weight. There is a small progressive cost as well, so {x;q=1 y;q=1} turns into x;w=0 y;w=0.0001. Because AcceptLanguage is fatally underspecified, we also have to normalize the Q values. +For each pair (d,a) in D and A: +The base distance between d and a is computed by canonicalizing both languages and maximizing, using likely subtags, then computing the following. +baseDistance = diff(d.language, a.language) + diff(d.script, a.script) + diff(d.region, a.region) + diff(d.variants, a.variants) +There is also a small distance allotted for the maximization. That is, "en-Latn-CA" vs "en-Latn-CA" where the second "Latn" was added by maximization, will have a non-zero distance. Variants are handled as a sorted set, and the distance is variantDistance * (count(variants1-variants2) + count(variants2-variants1)). As yet, there is no distance for extensions, but that may come in the future. +We then compute: +weight(d,a) = weight(d) * weight(a) * baseDistance(d,a) +The weight of each a is then computed as the min(weight(d,a)) for all d. The a with the smallest such weight is the winner. The "goodness" of the match is given as a scale from 0.0(perfect) to 1.0 (awful). Constants are provided for a Script-only difference and a Region-only difference, for comparison. +If, however, the winning language has too low a threshold, then the default locale (first in the available languages list) is returned. +Note that the distance metric is not symmetric: the distance from zh to yue may be different than the distance from yue to zh. That happens when it is more likely that a reader of yue would understand zh than the reverse. +Note that this doesn't have to be an N x M algorithm. Because there is a minimum threshold (otherwise returning the default locale), we can precompute the possible base language subtags that could be returned; anything else can be discarded. +Data Sample +The data is designed to be relatively simple to understand. It would typically be processed into an internal format for fast processing. The data does not need to be exact; only the relative computed values are important. However, for keep the types of fields apart, they are given very different values. TODO: add values for ISO 636 Deprecation Requests - DRAFT + + +8 +1 +1 + +64 +64 +96 +96 +128 + +64 +64 +64 +64 +64 +64 + +128 + +8 +64 +8 + +1024 +256 +64 +16 + +Interpreting the Format +The list is ordered, so the first match for a given type wins. That is, logically, you walk through the list looking for language matches. At the first one, you record the distance. Then you walk though for script differences, and so on. +The attributes desired and available both take language tags, and are assumed to be maximized for matching. +The Unknown subtags (und, Zzzz, ZZ, UNKNOWN) match any subtag of the same type. Trailing unknown values can be omitted. "*" is a special value, used for the default distances. The macro regions (eg, 019 = Americas) match any region in them. So und-155 matches any language in Western Europe (155). +As we expand, we may find out that we want more expressive power, like regex. +The attribute oneWay="true" indicates that the distance is only one direction. +Issues +Should we have the values be symbolic rather than literal numbers? eg: L, S, R, ... instead of 1024, 256, 64,... +The "*" is a bit of a hack. Other thoughts for syntax? \ No newline at end of file diff --git a/docs/site/TEMP-TEXT-FILES/list-formatting.txt b/docs/site/TEMP-TEXT-FILES/list-formatting.txt new file mode 100644 index 00000000000..b4383c8418a --- /dev/null +++ b/docs/site/TEMP-TEXT-FILES/list-formatting.txt @@ -0,0 +1,32 @@ +List Formatting +We add a set of patterns used for formatting variable-length lists, such as "A, B, C, and D" as follows: + + +{0}, {0} +{0}, {1} +{0}, {1} +{0}, {1} + + +The way this works is that you format with type = exact number if there is one (eg type="2"). If not: +Format the last two elements with the "end" format. +Then use middle format to add on subsequent elements working towards the front, all but the very first element. That is, {1} is what you've already done, and {0} is the previous element. +Then use "start" to add the front element, again with {1} as what you've done so far, and {0} is the first element. +Thus a list (a,b,c,...m, n) is formatted as +start(a,middle(b,middle(c,middle(...end(m, n))...))) +By using start, middle, and end, we have the possibility of doing something special between the first two and last two elements. So here's how it would work for English. + + +{0} and {1} +{0}, and {1} +{0}, {1} +{0}, {1} + + +Thus a list (a,b,c,d) is formatted as "a, b, c, and d" using this. +Note that a higher level needs to handle the cases of zero and one element. Typically one element would just be that element; for zero elements a different structure might be substituted. Example: +zero: There are no meetings scheduled. +one: There is a meeting scheduled on Wednesday. +other: There are meetings scheduled on Wednesday, Friday, and Saturday. +(The grammar of rest of these sentences aside from the list can be handled with plural formatting.) +To account for the issue Philip raises, we might want to have alt values for a semi-colon (like) variant. \ No newline at end of file diff --git a/docs/site/TEMP-TEXT-FILES/locale-format.txt b/docs/site/TEMP-TEXT-FILES/locale-format.txt new file mode 100644 index 00000000000..3ec6a62f6c1 --- /dev/null +++ b/docs/site/TEMP-TEXT-FILES/locale-format.txt @@ -0,0 +1,47 @@ +Locale Format +Problem: +Currently, we can get formats like the following: +Chinese (Simplified Han) +Simplified Chinese (Singapore) +Chinese (Simplified Han, Singapore) +English (United States) +American English +English (United States, Variant) +American English (Variant) +But we want to be able to have formats like: +Chinese (Simplified, Singapore) +Chinese (Simplified) +English (US), or English (American) +English (UK), or English (British) +English (US, Variant) +Here is a proposal for how to do this: +Our current data looks like this (English): + +{0} ({1}) +, + +Simplified Chinese +Traditional Chinese +U.S. English + + +What happens is that in formatting, the fields that are not present in the type are put into {1} in the localePattern, separated by the localeSeparator (if there is more than one). +We would change it slightly so that we could have patterns like: +Chinese (Simplified{SEP_LEFT}) +English (US{SEP_LEFT}) +{SEP_LEFT} is whatever is left: separated by localeSeparator, and with localeSeparator in front +{LEFT} is whatever is left: separated by localeSeparator, but with no initial localeSeparator +Then we get: +en_US_VARIANT => English (US, Variant) +If there is no placeholder in the pattern, it works the old way. +Issue: +Add context="", "standalone", "short", "short standalone" +If you have type="en_US", then it will get one of the following: +"": English (American) or English (United States) +"short": English (US) +"standalone": American English +"short standalone": US English +We would also add context="short" on Regions, to get "US", and use it if there wasn't a short form of en_US context="short" or "short standalone" +Fallbacks: +short standalone => standalone => "" +short => "" \ No newline at end of file diff --git a/docs/site/TEMP-TEXT-FILES/localized-gmt-format.txt b/docs/site/TEMP-TEXT-FILES/localized-gmt-format.txt new file mode 100644 index 00000000000..463c2bb9ebd --- /dev/null +++ b/docs/site/TEMP-TEXT-FILES/localized-gmt-format.txt @@ -0,0 +1,49 @@ +Localized GMT Format +Tickets +#3665 Additional time zone offset second field +#5382 Add short localized GMT format +Requirements +Many zones in the IANA time zone database use LMT as the initial rule. LMT is calculated from longitude of each location and has non-zero seconds offset. For example, America/Los_Angeles uses -7:52:58 as the initial UTC offset. At this moment, CLDR does not have a pattern including seconds field. +Localized GMT format is used as the final fallback of other name types. Other name types have short/long variation, but localized GMT format does not have such variation. In many cases, UTC offsets can be represented by integer hours, and offset minutes field would be redundant when shorter format is desired. +Current Implementation +In CLDR 22, elements used for localized GMT format are below: + Format patterns used for representing UTC offset. This item is a single string containing two patterns, one for positive offset and another for negative offset, separated by semicolon (;). For example, "+HH:mm;-HH:mm". Each pattern must contain "H" (0-based 24 hours field) and "m" (minutes field). + Message format pattern such as "GMT{0}" used for localized GMT format. The variable part is replaced with UTC offset representation created by above. + The string used for UTC (GMT) itself, such as "GMT". The string is used only when UTC offset is 0. +Proposed Changes +Below are the high level overview of the changes in this proposal +Deprecate element +Introduce new element, with type attribute representing combinations - ( h | hm | hms ). For example, +H:m;-H:m +Introduce new to store a locale specific separator used for offset patterns. Character colon (:) is reserved in patterns for locale specific separator and actual pattern is produced by replacing colon (:) with the separator character specified by element. +With above change, root.xml would be changed from +Old: ++HH:mm;-HH:mm +New: ++H;-H ++H:m;-H:m ++H:m:s;-H:m:s +: +The table below illustrates the behavior of long / short format, with the root data above. +"long" format always uses zero-padded 2 digits for offset hours field, such as "00", "08", "11". +"long" format does not use . +With above two, "long" format is expected to generates fixed length outputs practically (non-zero seconds offset is not used for modern dates). +"short" format always uses shortest offset hours field, such as "0", "8", "11". +"short" format uses the shortest pattern (h < hm < hms) without offset data loss. +Design considerations + uses single "H", "m", "s", because they just indicate the disposition of these fields. "H" is interpreted as date format pattern "HH" or "H" depending on the width context. +Many locales simply use the root data. Some locale may override only . +Some existing locale data do not use any separators (e.g. zh.xml). This can be represented by to be empty string. However, empty string as data does not fit well to CLDR structure, so such locale data require to provide at least and . +Some existing locale data uses U+2212 MINUS SIGN instead of U+002D HYPHEN-MINUS. These locales need to provide all of types. +Open Issues +1. Distinction of H and HH in the current locale data. +Some locales currently use single "H" in . ++H:mm;-H:mm (cs.xml) ++H.mm;-H.mm (fi.xml) +This proposal is trying to set a new assumption that "long" format to be practically fixed length, and long format always place leading zero for single digit hour value. If this assumption is not acceptable by these locales, then the design must be changed to allow "HH" or "H" in element, then "short" format to interpret "HH" as "H" (opposite way). However, I don't think this is the case. +2. Needs for long/short message pattern? +Although, ticket #5382 mentioned about offset part of localized GMT format, some locales may want to have two data in different length. For example, +Гриинуич{0} (bg.xml) +গ্রীনিচ মান সময় {0} (bn.xml) +There are some locales using relatively long patterns. If long/short distinction is given, these locales may want to provide shorter format such as "UTC{0}". +3. Impacts in CLDR ST +Because of another level of abstraction (separator, actual pattern width by context), this proposal may need a little bit more work on CLDR ST. \ No newline at end of file diff --git a/docs/site/TEMP-TEXT-FILES/math-formula-preferences.txt b/docs/site/TEMP-TEXT-FILES/math-formula-preferences.txt new file mode 100644 index 00000000000..d857d4acf68 --- /dev/null +++ b/docs/site/TEMP-TEXT-FILES/math-formula-preferences.txt @@ -0,0 +1,21 @@ +Math Formula Preferences +As outlined in http://unicode.org/cldr/trac/ticket/10100, +the directional flow for mathematical formulas can differ across bidirectional locales, as does the numbering system used for writing mathematical formulas. As we can see in the map below, some Arabic speaking prefer a left to right presentation for mathematical formulas, while others prefer right to left. Furthermore, the numbering system used in mathematical formulas may differ from the numbering system used for formatting regular numbers. +This proposal adds some additional structure to CLDR's DTD to allow applications to format mathematical formulas properly: +1). Under the "numbers" element, add a new element mathFormulaDirection as follows..... + + + + + +2). Under the "otherNumberingSystems" element, add an additional numbering system called "math", that can be used to handle those situations where the default numbering system for the locales differs from the numbering system used in mathematical formulas. We can and should document in tr35 , that if the "math" numbering system is not defined for a locale, then the default numbering system should be used + + + + + + +Given the information we have currently, the amount of new data needed in CLDR is fairly minimal. In root.xml, we would have: +mathFormulaDirection = "left-to-right", while ar.xml would have "right-to-left", which would cover the majority of Arabic speaking locales, but we would then add "left-to-right" in ar_MO.xml to cover Morocco. +Similarly, the vast majority of Arabic speaking locales would simply inherit their "math" numbering system from the default numbering system for the locale, and we would only need to explicitly specify a "math" numbering system where it differs from the default, for example, Yemen, Oman, Iraq. \ No newline at end of file diff --git a/docs/site/development/development-process/design-proposals/language-distance-data.md b/docs/site/development/development-process/design-proposals/language-distance-data.md new file mode 100644 index 00000000000..9db853fce55 --- /dev/null +++ b/docs/site/development/development-process/design-proposals/language-distance-data.md @@ -0,0 +1,199 @@ +--- +title: Language Distance Data +--- + +# Language Distance Data + +The purpose is to provide a way to match language/locales according to "closeness" rather than just a truncation algorithm. and to allow for the user to specify multiple acceptable languages. The data is designed to allow for an algorithm that can account for the closeness of the relations between, say, tl and fil, or en-US and en-CA. This is based on code that we already use, but expanded to be more data-driven. + +For example, if I understand written American English, German, French, Swiss German, and Italian, and the product has {ja-JP, de, zh-TW}, then de would be the best match; if I understand only {zh}, then zh-TW would be the best match. This represents a superset of the capabilities of locale fallback. Stated in those terms, it can have the effect of a more complex fallback, such as: + +sr-Cyrl-RS + +sr-Cyrl + +sr-Latn-RS + +sr-Latn + +sr + +hr-Latn + +hr + +Note that the goal, as with the rest of CLDR, is for matching written languages. Should we find in the future that it is also important to support spoken language matching in the same way, variant weights could be supplied. + +This is related to the current aliasing mechanism, which is used to equate he and iw, for example. It is used to find the best locale ID for a given request, but does not interact with the fallback of resources *within the locale-parent chain.* It subsumes and replaces the current \ element (we'd take the current information in those elements and apply it). + +## Expected Input + +1. a weighted list of desired languages D (like AcceptLanguage) +2. a weighted list of available languages A (eg supported languages) + +In the examples, the weights are given in AcceptLanguage syntax, eg ";" + number in (0.0 to 1.0). The weight 0.0 means don't match at all. Unlike AcceptLanguage, however, the relations among variants like "en" and "en-CA" are taken into account. + +In very many cases, the weights will all be identical (1.0). Some exceptions might be: + +- For desired languages, to indicate a preference. For example, I happen to prefer English to German to French to Swiss German to Italian. So the desired list for me might be {"en-US;q=1", "de;q=0.9", "fr;q=0.85", "gsw;q=0.8", "it;q=0.6"} +- For available languages, it can be used to indicate the "quality" of the user experience. Thus if it is known that the German version of a product or site is quite good, but the Danish is substandard, that could be reflected in the weightings. In most cases, however, the available language weights would be the same. + +## Expected Output + +1. A "best fit" language from A +2. A measure of how good the fit is + +## Examples + +Input: + +desired: {"en-CA;q=1", "fr;q=1"} + +available: {"en-GB;q=1", "en-US;q=1"} + +threshold: script + +Output: + +en-US + +good + +Input: + +desired: {"en-ZA;q=1", "fr;q=1"} + +available: {"en-GB;q=1", "en-US;q=1", "fr-CA;q=0.9"} + +threshold: script + +Output: + +en-GB + +good + +Input: + +desired: {"de"} + +available: {"en-GB;q=1", "en-US;q=1", "fr-CA;q=0.9"} + +threshold: script + +Output: + +en-GB + +bad + +## Internals + +The following is a logical expression of how this data can be used. + +The lists are processed, with each Q value being inverted (x = 1/x) to derive a weight. There is a small progressive cost as well, so {x;q=1 y;q=1} turns into x;w=0 y;w=0.0001. Because AcceptLanguage is fatally underspecified, we also have to normalize the Q values. + +For each pair (d,a) in D and A: + +The base distance between d and a is computed by canonicalizing both languages and maximizing, using likely subtags, then computing the following. + +baseDistance = diff(d.language, a.language) + diff(d.script, a.script) + diff(d.region, a.region) + diff(d.variants, a.variants) + +There is also a small distance allotted for the maximization. That is, "en-Latn-CA" vs "en-Latn-CA" where the second "Latn" was added by maximization, will have a non-zero distance. Variants are handled as a sorted set, and the distance is variantDistance \* (count(variants1-variants2) + count(variants2-variants1)). As yet, there is no distance for extensions, but that may come in the future. + +We then compute: + +weight(d,a) = weight(d) \* weight(a) \* baseDistance(d,a) + +The weight of each a is then computed as the min(weight(d,a)) for all d. The a with the smallest such weight is the winner. The "goodness" of the match is given as a scale from 0.0(perfect) to 1.0 (awful). Constants are provided for a Script-only difference and a Region-only difference, for comparison. + +If, however, the winning language has too low a threshold, then the default locale (first in the available languages list) is returned. + +Note that the distance metric is *not* symmetric: the distance from zh to yue may be different than the distance from yue to zh. That happens when it is more likely that a reader of yue would understand zh than the reverse. + +Note that this doesn't have to be an N x M algorithm. Because there is a minimum threshold (otherwise returning the default locale), we can precompute the possible base language subtags that could be returned; anything else can be discarded. + +## Data Sample + +The data is designed to be relatively simple to understand. It would typically be processed into an internal format for fast processing. The data does not need to be exact; only the relative computed values are important. However, for keep the types of fields apart, they are given very different values. TODO: add values for [ISO 636 Deprecation Requests - DRAFT](https://cldr.unicode.org/development/development-process/design-proposals/iso-636-deprecation-requests-draft) + +\ + +\ + +\8\ + +\1\ + +\1\ + +\ + +\64\ + +\64\ + +\96\ + +\96\ + +\128\ + +\ + +\64\ + +\64\ + +\64\ + +\64\ + +\64\ + +\64\ + +\ + +\128\ + +\ + +\8\ \ + +\64\ \ + +\8\ \ + +\ + +\1024\ \ + +\256\ \ + +\64\ \ + +\16\ \ + +\ + +## Interpreting the Format + +1. The list is ordered, so the first match for a given type wins. That is, logically, you walk through the list looking for language matches. At the first one, you record the distance. Then you walk though for script differences, and so on. +2. The attributes desired and available both take language tags, and are assumed to be maximized for matching. +3. The Unknown subtags (und, Zzzz, ZZ, UNKNOWN) match any subtag of the same type. Trailing unknown values can be omitted. "\*" is a special value, used for the default distances. The macro regions (eg, 019 = Americas) match any region in them. So und-155 matches any language in Western Europe (155). + 1. As we expand, we may find out that we want more expressive power, like regex. +4. The attribute oneWay="true" indicates that the distance is only one direction. + +Issues + +- Should we have the values be symbolic rather than literal numbers? eg: L, S, R, ... instead of 1024, 256, 64,... +- The "\*" is a bit of a hack. Other thoughts for syntax? + +![Unicode copyright](https://www.unicode.org/img/hb_notice.gif) \ No newline at end of file diff --git a/docs/site/development/development-process/design-proposals/list-formatting.md b/docs/site/development/development-process/design-proposals/list-formatting.md new file mode 100644 index 00000000000..18ff38972e6 --- /dev/null +++ b/docs/site/development/development-process/design-proposals/list-formatting.md @@ -0,0 +1,66 @@ +--- +title: List Formatting +--- + +# List Formatting + +We add a set of patterns used for formatting variable-length lists, such as "A, B, C, and D" as follows: + +\ + + \ + +  \{0}, {0}\ + +  \{0}, {1}\ + +  \{0}, {1}\ + +  \{0}, {1}\ + + \ + +\ + +The way this works is that you format with type = exact number if there is one (eg type="2"). If not: + +1. Format the last two elements with the "end" format. +2. Then use middle format to add on subsequent elements working towards the front, all but the very first element. That is, {1} is what you've already done, and {0} is the previous element. +3. Then use "start" to add the front element, again with {1} as what you've done so far, and {0} is the first element. + +Thus a list (a,b,c,...m, n) is formatted as + +start(a,middle(b,middle(c,middle(...end(m, n))...))) + +By using start, middle, and end, we have the possibility of doing something special between the first two and last two elements. So here's how it would work for English. + +\ + + \ + +  \{0} and {1}\ + +  \{0}, and {1}\ + +  \{0}, {1}\ + +  \{0}, {1}\ + + \ + +\ + +Thus a list (a,b,c,d) is formatted as "a, b, c, and d" using this. + +Note that a higher level needs to handle the cases of zero and one element. Typically one element would just be that element; for zero elements a different structure might be substituted. Example: + +- zero: There are no meetings scheduled. +- one: There is a meeting scheduled on Wednesday. +- other: There are meetings scheduled on Wednesday, Friday, and Saturday. + +(The grammar of rest of these sentences aside from the list can be handled with plural formatting.) + +To account for the issue Philip raises, we might want to have alt values for a semi-colon (like) variant. + + +![Unicode copyright](https://www.unicode.org/img/hb_notice.gif) \ No newline at end of file diff --git a/docs/site/development/development-process/design-proposals/locale-format.md b/docs/site/development/development-process/design-proposals/locale-format.md new file mode 100644 index 00000000000..6bcb30c0ad5 --- /dev/null +++ b/docs/site/development/development-process/design-proposals/locale-format.md @@ -0,0 +1,87 @@ +--- +title: Locale Format +--- + +# Locale Format + +**Problem:** + +Currently, we can get formats like the following: + +Chinese (Simplified Han) + +Simplified Chinese (Singapore) + +Chinese (Simplified Han, Singapore) + +English (United States) + +American English + +English (United States, Variant) + +American English (Variant) + +But we want to be able to have formats like: + +**Chinese (Simplified, Singapore)** + +**Chinese (Simplified)** + +**English (US), or English (American)** + +**English (UK), or English (British)** + +**English (US, Variant)** + +Here is a proposal for how to do this: + +Our current data looks like this (English): + +\ + +\{0} ({1})\ + +\, \ + +\ + +1. \Simplified Chinese\ +2. \Traditional Chinese\ +3. \U.S. English\ +4. \ +5. \ + +What happens is that in formatting, the fields that are not present in the type are put into {1} in the localePattern, separated by the localeSeparator (if there is more than one). + +We would change it slightly so that we could have patterns like: + +1. \Chinese (Simplified{SEP\_LEFT})\ +2. \English (US{SEP\_LEFT})\ + +{SEP\_LEFT} is whatever is left: separated by localeSeparator, and with localeSeparator in front + +{LEFT} is whatever is left: separated by localeSeparator, but with no initial localeSeparator + +Then we get: + +en\_US\_VARIANT => English (US, Variant) + +If there is no placeholder in the pattern, it works the old way. + +### Issue: + +1. Add context="", "standalone", "short", "short standalone" +2. If you have type="en\_US", then it will get one of the following: + 1. "": English (American) *or* English (United States) + 2. "short": English (US) + 3. "standalone": American English + 4. "short standalone": US English +3. We would also add context="short" on Regions, to get "US", and use it if there wasn't a short form of en\_US context="short" or "short standalone" + +Fallbacks: + +- short standalone => standalone => "" +- short => "" + +![Unicode copyright](https://www.unicode.org/img/hb_notice.gif) \ No newline at end of file diff --git a/docs/site/development/development-process/design-proposals/localized-gmt-format.md b/docs/site/development/development-process/design-proposals/localized-gmt-format.md new file mode 100644 index 00000000000..a21d71261af --- /dev/null +++ b/docs/site/development/development-process/design-proposals/localized-gmt-format.md @@ -0,0 +1,100 @@ +--- +title: Localized GMT Format +--- + +# Localized GMT Format + +### Tickets + +[#3665](http://unicode.org/cldr/trac/ticket/3665) Additional time zone offset second field + +[#5382](http://unicode.org/cldr/trac/ticket/5382) Add short localized GMT format + +### Requirements + +- Many zones in the IANA time zone database use LMT as the initial rule. LMT is calculated from longitude of each location and has non-zero seconds offset. For example, America/Los\_Angeles uses -7:52:58 as the initial UTC offset. At this moment, CLDR does not have a pattern including seconds field. +- Localized GMT format is used as the final fallback of other name types. Other name types have short/long variation, but localized GMT format does not have such variation. In many cases, UTC offsets can be represented by integer hours, and offset minutes field would be redundant when shorter format is desired. + +### Current Implementation + +In CLDR 22, elements used for localized GMT format are below: + +- \ Format patterns used for representing UTC offset. This item is a single string containing two patterns, one for positive offset and another for negative offset, separated by semicolon (;). For example, "+HH:mm;-HH:mm". Each pattern must contain "H" (0-based 24 hours field) and "m" (minutes field). +- \ Message format pattern such as "GMT{0}" used for localized GMT format. The variable part is replaced with UTC offset representation created by \ above. +- \ The string used for UTC (GMT) itself, such as "GMT". The string is used only when UTC offset is 0. + +### Proposed Changes + +Below are the high level overview of the changes in this proposal + +- Deprecate \ element +- Introduce new \ element, with type attribute representing combinations - ( h | hm | hms ). For example, \+H:m;-H:m\ +- Introduce new \ to store a locale specific separator used for offset patterns. Character colon (:) is reserved in \ patterns for locale specific separator and actual pattern is produced by replacing colon (:) with the separator character specified by \ element. + +With above change, root.xml would be changed from + +**Old:** + + \+HH:mm;-HH:mm\ + +**New:** + + \+H;-H\ + + \+H:m;-H:m\ + + \+H:m:s;-H:m:s\ + + \:\ + +The table below illustrates the behavior of long / short format, with the root data above. + +| UTC Offset | Width | Output | Comment | +|---|---|---|---| +| -8:00:00 | long | GMT-08:00 | The negative pattern from <gmtOffsetPattern type="hm">, interpret 'H' as fixed 2 digits hour, replace ':' with <gmtOffsetSeparator> | +| | short | GMT-8 | The negative pattern from <gmtOffsetPattern type"h"> | +| -8:30:00 | long | GMT-08:30 | The negative pattern from <gmtOffsetPattern type="hm">, interpret 'H' as fixed 2 digits hour, replace ':' with <gmtOffsetSeparator> | +| | short | GMT-8:30 | The negative pattern from <gmtOffsetPattern type="hm">, interpret 'H' as variable width hour, replace ':' with <gmtOffsetSeparator> | +| -8:23:45 | long | GMT-08:23:45 | The negative pattern from <gmtOffsetPattern type="hms">, interpret 'H' as fixed 2 digits hour, replace ':' with <gmtOffsetSeparator> | +| | short | GMT-8:23:45 | The negative pattern from <gmtOffsetPattern type="hms">, interpret 'H' as variable width hour, replace ':' with <gmtOffsetSeparator> | + +- "long" format always uses zero-padded 2 digits for offset hours field, such as "00", "08", "11". +- "long" format does not use \. +- With above two, "long" format is expected to generates fixed length outputs practically (non-zero seconds offset is not used for modern dates). +- "short" format always uses shortest offset hours field, such as "0", "8", "11". +- "short" format uses the shortest pattern (h \< hm \< hms) without offset data loss. + +Design considerations + +- \ uses single "H", "m", "s", because they just indicate the disposition of these fields. "H" is interpreted as date format pattern "HH" or "H" depending on the width context. +- Many locales simply use the root data. Some locale may override only \. +- Some existing locale data do not use any separators (e.g. zh.xml). This can be represented by \ to be empty string. However, empty string as data does not fit well to CLDR structure, so such locale data require to provide at least \ and \. +- Some existing locale data uses U+2212 MINUS SIGN instead of U+002D HYPHEN-MINUS. These locales need to provide all of \ types. + +### Open Issues + +1. Distinction of H and HH in the current locale data. + +Some locales currently use single "H" in \. + + \+H:mm;-H:mm\ (cs.xml) + + \+H.mm;-H.mm\ (fi.xml) + +This proposal is trying to set a new assumption that "long" format to be practically fixed length, and long format always place leading zero for single digit hour value. If this assumption is not acceptable by these locales, then the design must be changed to allow "HH" or "H" in \ element, then "short" format to interpret "HH" as "H" (opposite way). However, I don't think this is the case. + +2. Needs for long/short message pattern? + +Although, [ticket #5382](http://unicode.org/cldr/trac/ticket/5382) mentioned about offset part of localized GMT format, some locales may want to have two \ data in different length. For example, + + \Гриинуич{0}\ (bg.xml) + + \গ্রীনিচ মান সময় {0}\ (bn.xml) + +There are some locales using relatively long patterns. If long/short distinction is given, these locales may want to provide shorter format such as "UTC{0}". + +3. Impacts in CLDR ST + +Because of another level of abstraction (separator, actual pattern width by context), this proposal may need a little bit more work on CLDR ST. + +![Unicode copyright](https://www.unicode.org/img/hb_notice.gif) \ No newline at end of file diff --git a/docs/site/development/development-process/design-proposals/math-formula-preferences.md b/docs/site/development/development-process/design-proposals/math-formula-preferences.md new file mode 100644 index 00000000000..f21819c15a0 --- /dev/null +++ b/docs/site/development/development-process/design-proposals/math-formula-preferences.md @@ -0,0 +1,48 @@ +--- +title: Math Formula Preferences +--- + +# Math Formula Preferences + +As outlined in [http://unicode.org/cldr/trac/ticket/10100,](http://unicode.org/cldr/trac/ticket/10100) + +the directional flow for mathematical formulas can differ across bidirectional locales, as does the numbering system used for writing mathematical formulas. As we can see in the map below, some Arabic speaking prefer a left to right presentation for mathematical formulas, while others prefer right to left. Furthermore, the numbering system used in mathematical formulas may differ from the numbering system used for formatting regular numbers. + +![image](../../../images/design-proposals/MathFormularDir_GoogleMap.PNG) + +This proposal adds some additional structure to CLDR's DTD to allow applications to format mathematical formulas properly: + +1. Under the "numbers" element, add a new element mathFormulaDirection as follows..... + +\ + +\ + +\ + + \ + + \ + +2. Under the "otherNumberingSystems" element, add an additional numbering system called "math", that can be used to handle those situations where the default numbering system for the locales differs from the numbering system used in mathematical formulas. We can and should document in[tr35](http://www.unicode.org/reports/tr35/tr35-numbers.html#otherNumberingSystems) , that if the "math" numbering system is not defined for a locale, then the default numbering system should be used +\ + +\ + +\ + +\ + + \ + + \ + +Given the information we have currently, the amount of new data needed in CLDR is fairly minimal. In root.xml, we would have: + +mathFormulaDirection = "left-to-right", while ar.xml would have "right-to-left", which would cover the majority of Arabic speaking locales, but we would then add "left-to-right" in ar\_MO.xml to cover Morocco. + +Similarly, the vast majority of Arabic speaking locales would simply inherit their "math" numbering system from the default numbering system for the locale, and we would only need to explicitly specify a "math" numbering system where it differs from the default, for example, Yemen, Oman, Iraq. + +![Unicode copyright](https://www.unicode.org/img/hb_notice.gif) \ No newline at end of file diff --git a/docs/site/images/design-proposals/MathFormularDir_GoogleMap.PNG b/docs/site/images/design-proposals/MathFormularDir_GoogleMap.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d41cab5b1636a63c88d383a94bdee8ca292cb91d GIT binary patch literal 63562 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 literal 0 HcmV?d00001 From a3dd6a9e800fdd61746d47fb3b91536aed15740e Mon Sep 17 00:00:00 2001 From: Chris Pyle Date: Sat, 6 Jul 2024 13:45:47 -0400 Subject: [PATCH 2/3] CLDR-17566 text diffs and minor change --- .../language-distance-data.txt | 8 ++--- docs/site/TEMP-TEXT-FILES/list-formatting.txt | 24 +++++++------- .../TEMP-TEXT-FILES/localized-gmt-format.txt | 31 ++++++++++++------- .../math-formula-preferences.txt | 16 +++++----- .../math-formula-preferences.md | 3 +- 5 files changed, 45 insertions(+), 37 deletions(-) diff --git a/docs/site/TEMP-TEXT-FILES/language-distance-data.txt b/docs/site/TEMP-TEXT-FILES/language-distance-data.txt index bf2e7164217..5f2b73be007 100644 --- a/docs/site/TEMP-TEXT-FILES/language-distance-data.txt +++ b/docs/site/TEMP-TEXT-FILES/language-distance-data.txt @@ -58,7 +58,7 @@ Note that this doesn't have to be an N x M algorithm. Because there is a minimum Data Sample The data is designed to be relatively simple to understand. It would typically be processed into an internal format for fast processing. The data does not need to be exact; only the relative computed values are important. However, for keep the types of fields apart, they are given very different values. TODO: add values for ISO 636 Deprecation Requests - DRAFT - + 8 1 1 @@ -82,9 +82,9 @@ The data is designed to be relatively simple to understand. It would typically b 64 8 + Must be last! + Note that deprecated differences in the alias file are given a weight of 1, + and before this point. --> 1024 256 64 diff --git a/docs/site/TEMP-TEXT-FILES/list-formatting.txt b/docs/site/TEMP-TEXT-FILES/list-formatting.txt index b4383c8418a..d3412e63015 100644 --- a/docs/site/TEMP-TEXT-FILES/list-formatting.txt +++ b/docs/site/TEMP-TEXT-FILES/list-formatting.txt @@ -1,12 +1,12 @@ List Formatting We add a set of patterns used for formatting variable-length lists, such as "A, B, C, and D" as follows: - -{0}, {0} -{0}, {1} -{0}, {1} -{0}, {1} - +  +  {0}, {0} +  {0}, {1} +  {0}, {1} +  {0}, {1} +  The way this works is that you format with type = exact number if there is one (eg type="2"). If not: Format the last two elements with the "end" format. @@ -16,12 +16,12 @@ Thus a list (a,b,c,...m, n) is formatted as start(a,middle(b,middle(c,middle(...end(m, n))...))) By using start, middle, and end, we have the possibility of doing something special between the first two and last two elements. So here's how it would work for English. - -{0} and {1} -{0}, and {1} -{0}, {1} -{0}, {1} - +  +  {0} and {1} +  {0}, and {1} +  {0}, {1} +  {0}, {1} +  Thus a list (a,b,c,d) is formatted as "a, b, c, and d" using this. Note that a higher level needs to handle the cases of zero and one element. Typically one element would just be that element; for zero elements a different structure might be substituted. Example: diff --git a/docs/site/TEMP-TEXT-FILES/localized-gmt-format.txt b/docs/site/TEMP-TEXT-FILES/localized-gmt-format.txt index 463c2bb9ebd..a306e57d769 100644 --- a/docs/site/TEMP-TEXT-FILES/localized-gmt-format.txt +++ b/docs/site/TEMP-TEXT-FILES/localized-gmt-format.txt @@ -17,13 +17,20 @@ Introduce new element, with type attribute representing combi Introduce new to store a locale specific separator used for offset patterns. Character colon (:) is reserved in patterns for locale specific separator and actual pattern is produced by replacing colon (:) with the separator character specified by element. With above change, root.xml would be changed from Old: -+HH:mm;-HH:mm + +HH:mm;-HH:mm New: -+H;-H -+H:m;-H:m -+H:m:s;-H:m:s -: + +H;-H + +H:m;-H:m + +H:m:s;-H:m:s + : The table below illustrates the behavior of long / short format, with the root data above. +UTC Offset Width Output Comment +-8:00:00 long GMT-08:00 The negative pattern from , interpret 'H' as fixed 2 digits hour, replace ':' with +short GMT-8 The negative pattern from +-8:30:00 long GMT-08:30 The negative pattern from , interpret 'H' as fixed 2 digits hour, replace ':' with +short GMT-8:30 The negative pattern from , interpret 'H' as variable width hour, replace ':' with +-8:23:45 long GMT-08:23:45 The negative pattern from , interpret 'H' as fixed 2 digits hour, replace ':' with +short GMT-8:23:45 The negative pattern from , interpret 'H' as variable width hour, replace ':' with "long" format always uses zero-padded 2 digits for offset hours field, such as "00", "08", "11". "long" format does not use . With above two, "long" format is expected to generates fixed length outputs practically (non-zero seconds offset is not used for modern dates). @@ -35,15 +42,15 @@ Many locales simply use the root data. Some locale may override only to be empty string. However, empty string as data does not fit well to CLDR structure, so such locale data require to provide at least and . Some existing locale data uses U+2212 MINUS SIGN instead of U+002D HYPHEN-MINUS. These locales need to provide all of types. Open Issues -1. Distinction of H and HH in the current locale data. +Distinction of H and HH in the current locale data. Some locales currently use single "H" in . -+H:mm;-H:mm (cs.xml) -+H.mm;-H.mm (fi.xml) + +H:mm;-H:mm (cs.xml) + +H.mm;-H.mm (fi.xml) This proposal is trying to set a new assumption that "long" format to be practically fixed length, and long format always place leading zero for single digit hour value. If this assumption is not acceptable by these locales, then the design must be changed to allow "HH" or "H" in element, then "short" format to interpret "HH" as "H" (opposite way). However, I don't think this is the case. -2. Needs for long/short message pattern? +Needs for long/short message pattern? Although, ticket #5382 mentioned about offset part of localized GMT format, some locales may want to have two data in different length. For example, -Гриинуич{0} (bg.xml) -গ্রীনিচ মান সময় {0} (bn.xml) + Гриинуич{0} (bg.xml) + গ্রীনিচ মান সময় {0} (bn.xml) There are some locales using relatively long patterns. If long/short distinction is given, these locales may want to provide shorter format such as "UTC{0}". -3. Impacts in CLDR ST +Impacts in CLDR ST Because of another level of abstraction (separator, actual pattern width by context), this proposal may need a little bit more work on CLDR ST. \ No newline at end of file diff --git a/docs/site/TEMP-TEXT-FILES/math-formula-preferences.txt b/docs/site/TEMP-TEXT-FILES/math-formula-preferences.txt index d857d4acf68..367c480e780 100644 --- a/docs/site/TEMP-TEXT-FILES/math-formula-preferences.txt +++ b/docs/site/TEMP-TEXT-FILES/math-formula-preferences.txt @@ -1,21 +1,21 @@ Math Formula Preferences As outlined in http://unicode.org/cldr/trac/ticket/10100, -the directional flow for mathematical formulas can differ across bidirectional locales, as does the numbering system used for writing mathematical formulas. As we can see in the map below, some Arabic speaking prefer a left to right presentation for mathematical formulas, while others prefer right to left. Furthermore, the numbering system used in mathematical formulas may differ from the numbering system used for formatting regular numbers. +the directional flow for mathematical formulas can differ across bidirectional locales, as does the numbering system used for writing mathematical formulas. As we can see in the map below, some Arabic speaking prefer a left to right presentation for mathematical formulas, while others prefer right to left. Furthermore, the numbering system used in mathematical formulas may differ from the numbering system used for formatting regular numbers. This proposal adds some additional structure to CLDR's DTD to allow applications to format mathematical formulas properly: -1). Under the "numbers" element, add a new element mathFormulaDirection as follows..... +Under the "numbers" element, add a new element mathFormulaDirection as follows..... - - -2). Under the "otherNumberingSystems" element, add an additional numbering system called "math", that can be used to handle those situations where the default numbering system for the locales differs from the numbering system used in mathematical formulas. We can and should document in tr35 , that if the "math" numbering system is not defined for a locale, then the default numbering system should be used +  +  +Under the "otherNumberingSystems" element, add an additional numbering system called "math", that can be used to handle those situations where the default numbering system for the locales differs from the numbering system used in mathematical formulas. We can and should document in tr35 , that if the "math" numbering system is not defined for a locale, then the default numbering system should be used - - -Given the information we have currently, the amount of new data needed in CLDR is fairly minimal. In root.xml, we would have: +  +  +Given the information we have currently, the amount of new data needed in CLDR is fairly minimal. In root.xml, we would have: mathFormulaDirection = "left-to-right", while ar.xml would have "right-to-left", which would cover the majority of Arabic speaking locales, but we would then add "left-to-right" in ar_MO.xml to cover Morocco. Similarly, the vast majority of Arabic speaking locales would simply inherit their "math" numbering system from the default numbering system for the locale, and we would only need to explicitly specify a "math" numbering system where it differs from the default, for example, Yemen, Oman, Iraq. \ No newline at end of file diff --git a/docs/site/development/development-process/design-proposals/math-formula-preferences.md b/docs/site/development/development-process/design-proposals/math-formula-preferences.md index f21819c15a0..967e69b6fca 100644 --- a/docs/site/development/development-process/design-proposals/math-formula-preferences.md +++ b/docs/site/development/development-process/design-proposals/math-formula-preferences.md @@ -26,7 +26,8 @@ This proposal adds some additional structure to CLDR's DTD to allow applications  \ -2. Under the "otherNumberingSystems" element, add an additional numbering system called "math", that can be used to handle those situations where the default numbering system for the locales differs from the numbering system used in mathematical formulas. We can and should document in[tr35](http://www.unicode.org/reports/tr35/tr35-numbers.html#otherNumberingSystems) , that if the "math" numbering system is not defined for a locale, then the default numbering system should be used +2. Under the "otherNumberingSystems" element, add an additional numbering system called "math", that can be used to handle those situations where the default numbering system for the locales differs from the numbering system used in mathematical formulas. We can and should document in [tr35](http://www.unicode.org/reports/tr35/tr35-numbers.html#otherNumberingSystems) , that if the "math" numbering system is not defined for a locale, then the default numbering system should be used + \ \ From 2e7aff4a44dbbf1017702f9cad13de5c1a889e2c Mon Sep 17 00:00:00 2001 From: Chris Pyle Date: Sat, 6 Jul 2024 13:46:30 -0400 Subject: [PATCH 3/3] CLDR-17566 removing text files --- .../language-distance-data.txt | 101 ------------------ docs/site/TEMP-TEXT-FILES/list-formatting.txt | 32 ------ docs/site/TEMP-TEXT-FILES/locale-format.txt | 47 -------- .../TEMP-TEXT-FILES/localized-gmt-format.txt | 56 ---------- .../math-formula-preferences.txt | 21 ---- 5 files changed, 257 deletions(-) delete mode 100644 docs/site/TEMP-TEXT-FILES/language-distance-data.txt delete mode 100644 docs/site/TEMP-TEXT-FILES/list-formatting.txt delete mode 100644 docs/site/TEMP-TEXT-FILES/locale-format.txt delete mode 100644 docs/site/TEMP-TEXT-FILES/localized-gmt-format.txt delete mode 100644 docs/site/TEMP-TEXT-FILES/math-formula-preferences.txt diff --git a/docs/site/TEMP-TEXT-FILES/language-distance-data.txt b/docs/site/TEMP-TEXT-FILES/language-distance-data.txt deleted file mode 100644 index 5f2b73be007..00000000000 --- a/docs/site/TEMP-TEXT-FILES/language-distance-data.txt +++ /dev/null @@ -1,101 +0,0 @@ -Language Distance Data -The purpose is to provide a way to match language/locales according to "closeness" rather than just a truncation algorithm. and to allow for the user to specify multiple acceptable languages. The data is designed to allow for an algorithm that can account for the closeness of the relations between, say, tl and fil, or en-US and en-CA. This is based on code that we already use, but expanded to be more data-driven. -For example, if I understand written American English, German, French, Swiss German, and Italian, and the product has {ja-JP, de, zh-TW}, then de would be the best match; if I understand only {zh}, then zh-TW would be the best match. This represents a superset of the capabilities of locale fallback. Stated in those terms, it can have the effect of a more complex fallback, such as: -sr-Cyrl-RS -sr-Cyrl -sr-Latn-RS -sr-Latn -sr -hr-Latn -hr -Note that the goal, as with the rest of CLDR, is for matching written languages. Should we find in the future that it is also important to support spoken language matching in the same way, variant weights could be supplied. -This is related to the current aliasing mechanism, which is used to equate he and iw, for example. It is used to find the best locale ID for a given request, but does not interact with the fallback of resources within the locale-parent chain. It subsumes and replaces the current element (we'd take the current information in those elements and apply it). -Expected Input -a weighted list of desired languages D (like AcceptLanguage) -a weighted list of available languages A (eg supported languages) -In the examples, the weights are given in AcceptLanguage syntax, eg ";" + number in (0.0 to 1.0). The weight 0.0 means don't match at all. Unlike AcceptLanguage, however, the relations among variants like "en" and "en-CA" are taken into account. -In very many cases, the weights will all be identical (1.0). Some exceptions might be: -For desired languages, to indicate a preference. For example, I happen to prefer English to German to French to Swiss German to Italian. So the desired list for me might be {"en-US;q=1", "de;q=0.9", "fr;q=0.85", "gsw;q=0.8", "it;q=0.6"} -For available languages, it can be used to indicate the "quality" of the user experience. Thus if it is known that the German version of a product or site is quite good, but the Danish is substandard, that could be reflected in the weightings. In most cases, however, the available language weights would be the same. -Expected Output -A "best fit" language from A -A measure of how good the fit is -Examples -Input: -desired: {"en-CA;q=1", "fr;q=1"} -available: {"en-GB;q=1", "en-US;q=1"} -threshold: script -Output: -en-US -good -Input: -desired: {"en-ZA;q=1", "fr;q=1"} -available: {"en-GB;q=1", "en-US;q=1", "fr-CA;q=0.9"} -threshold: script -Output: -en-GB -good -Input: -desired: {"de"} -available: {"en-GB;q=1", "en-US;q=1", "fr-CA;q=0.9"} -threshold: script -Output: -en-GB -bad -Internals -The following is a logical expression of how this data can be used. -The lists are processed, with each Q value being inverted (x = 1/x) to derive a weight. There is a small progressive cost as well, so {x;q=1 y;q=1} turns into x;w=0 y;w=0.0001. Because AcceptLanguage is fatally underspecified, we also have to normalize the Q values. -For each pair (d,a) in D and A: -The base distance between d and a is computed by canonicalizing both languages and maximizing, using likely subtags, then computing the following. -baseDistance = diff(d.language, a.language) + diff(d.script, a.script) + diff(d.region, a.region) + diff(d.variants, a.variants) -There is also a small distance allotted for the maximization. That is, "en-Latn-CA" vs "en-Latn-CA" where the second "Latn" was added by maximization, will have a non-zero distance. Variants are handled as a sorted set, and the distance is variantDistance * (count(variants1-variants2) + count(variants2-variants1)). As yet, there is no distance for extensions, but that may come in the future. -We then compute: -weight(d,a) = weight(d) * weight(a) * baseDistance(d,a) -The weight of each a is then computed as the min(weight(d,a)) for all d. The a with the smallest such weight is the winner. The "goodness" of the match is given as a scale from 0.0(perfect) to 1.0 (awful). Constants are provided for a Script-only difference and a Region-only difference, for comparison. -If, however, the winning language has too low a threshold, then the default locale (first in the available languages list) is returned. -Note that the distance metric is not symmetric: the distance from zh to yue may be different than the distance from yue to zh. That happens when it is more likely that a reader of yue would understand zh than the reverse. -Note that this doesn't have to be an N x M algorithm. Because there is a minimum threshold (otherwise returning the default locale), we can precompute the possible base language subtags that could be returned; anything else can be discarded. -Data Sample -The data is designed to be relatively simple to understand. It would typically be processed into an internal format for fast processing. The data does not need to be exact; only the relative computed values are important. However, for keep the types of fields apart, they are given very different values. TODO: add values for ISO 636 Deprecation Requests - DRAFT - - -8 -1 -1 - -64 -64 -96 -96 -128 - -64 -64 -64 -64 -64 -64 - -128 - -8 -64 -8 - -1024 -256 -64 -16 - -Interpreting the Format -The list is ordered, so the first match for a given type wins. That is, logically, you walk through the list looking for language matches. At the first one, you record the distance. Then you walk though for script differences, and so on. -The attributes desired and available both take language tags, and are assumed to be maximized for matching. -The Unknown subtags (und, Zzzz, ZZ, UNKNOWN) match any subtag of the same type. Trailing unknown values can be omitted. "*" is a special value, used for the default distances. The macro regions (eg, 019 = Americas) match any region in them. So und-155 matches any language in Western Europe (155). -As we expand, we may find out that we want more expressive power, like regex. -The attribute oneWay="true" indicates that the distance is only one direction. -Issues -Should we have the values be symbolic rather than literal numbers? eg: L, S, R, ... instead of 1024, 256, 64,... -The "*" is a bit of a hack. Other thoughts for syntax? \ No newline at end of file diff --git a/docs/site/TEMP-TEXT-FILES/list-formatting.txt b/docs/site/TEMP-TEXT-FILES/list-formatting.txt deleted file mode 100644 index d3412e63015..00000000000 --- a/docs/site/TEMP-TEXT-FILES/list-formatting.txt +++ /dev/null @@ -1,32 +0,0 @@ -List Formatting -We add a set of patterns used for formatting variable-length lists, such as "A, B, C, and D" as follows: - -  -  {0}, {0} -  {0}, {1} -  {0}, {1} -  {0}, {1} -  - -The way this works is that you format with type = exact number if there is one (eg type="2"). If not: -Format the last two elements with the "end" format. -Then use middle format to add on subsequent elements working towards the front, all but the very first element. That is, {1} is what you've already done, and {0} is the previous element. -Then use "start" to add the front element, again with {1} as what you've done so far, and {0} is the first element. -Thus a list (a,b,c,...m, n) is formatted as -start(a,middle(b,middle(c,middle(...end(m, n))...))) -By using start, middle, and end, we have the possibility of doing something special between the first two and last two elements. So here's how it would work for English. - -  -  {0} and {1} -  {0}, and {1} -  {0}, {1} -  {0}, {1} -  - -Thus a list (a,b,c,d) is formatted as "a, b, c, and d" using this. -Note that a higher level needs to handle the cases of zero and one element. Typically one element would just be that element; for zero elements a different structure might be substituted. Example: -zero: There are no meetings scheduled. -one: There is a meeting scheduled on Wednesday. -other: There are meetings scheduled on Wednesday, Friday, and Saturday. -(The grammar of rest of these sentences aside from the list can be handled with plural formatting.) -To account for the issue Philip raises, we might want to have alt values for a semi-colon (like) variant. \ No newline at end of file diff --git a/docs/site/TEMP-TEXT-FILES/locale-format.txt b/docs/site/TEMP-TEXT-FILES/locale-format.txt deleted file mode 100644 index 3ec6a62f6c1..00000000000 --- a/docs/site/TEMP-TEXT-FILES/locale-format.txt +++ /dev/null @@ -1,47 +0,0 @@ -Locale Format -Problem: -Currently, we can get formats like the following: -Chinese (Simplified Han) -Simplified Chinese (Singapore) -Chinese (Simplified Han, Singapore) -English (United States) -American English -English (United States, Variant) -American English (Variant) -But we want to be able to have formats like: -Chinese (Simplified, Singapore) -Chinese (Simplified) -English (US), or English (American) -English (UK), or English (British) -English (US, Variant) -Here is a proposal for how to do this: -Our current data looks like this (English): - -{0} ({1}) -, - -Simplified Chinese -Traditional Chinese -U.S. English - - -What happens is that in formatting, the fields that are not present in the type are put into {1} in the localePattern, separated by the localeSeparator (if there is more than one). -We would change it slightly so that we could have patterns like: -Chinese (Simplified{SEP_LEFT}) -English (US{SEP_LEFT}) -{SEP_LEFT} is whatever is left: separated by localeSeparator, and with localeSeparator in front -{LEFT} is whatever is left: separated by localeSeparator, but with no initial localeSeparator -Then we get: -en_US_VARIANT => English (US, Variant) -If there is no placeholder in the pattern, it works the old way. -Issue: -Add context="", "standalone", "short", "short standalone" -If you have type="en_US", then it will get one of the following: -"": English (American) or English (United States) -"short": English (US) -"standalone": American English -"short standalone": US English -We would also add context="short" on Regions, to get "US", and use it if there wasn't a short form of en_US context="short" or "short standalone" -Fallbacks: -short standalone => standalone => "" -short => "" \ No newline at end of file diff --git a/docs/site/TEMP-TEXT-FILES/localized-gmt-format.txt b/docs/site/TEMP-TEXT-FILES/localized-gmt-format.txt deleted file mode 100644 index a306e57d769..00000000000 --- a/docs/site/TEMP-TEXT-FILES/localized-gmt-format.txt +++ /dev/null @@ -1,56 +0,0 @@ -Localized GMT Format -Tickets -#3665 Additional time zone offset second field -#5382 Add short localized GMT format -Requirements -Many zones in the IANA time zone database use LMT as the initial rule. LMT is calculated from longitude of each location and has non-zero seconds offset. For example, America/Los_Angeles uses -7:52:58 as the initial UTC offset. At this moment, CLDR does not have a pattern including seconds field. -Localized GMT format is used as the final fallback of other name types. Other name types have short/long variation, but localized GMT format does not have such variation. In many cases, UTC offsets can be represented by integer hours, and offset minutes field would be redundant when shorter format is desired. -Current Implementation -In CLDR 22, elements used for localized GMT format are below: - Format patterns used for representing UTC offset. This item is a single string containing two patterns, one for positive offset and another for negative offset, separated by semicolon (;). For example, "+HH:mm;-HH:mm". Each pattern must contain "H" (0-based 24 hours field) and "m" (minutes field). - Message format pattern such as "GMT{0}" used for localized GMT format. The variable part is replaced with UTC offset representation created by above. - The string used for UTC (GMT) itself, such as "GMT". The string is used only when UTC offset is 0. -Proposed Changes -Below are the high level overview of the changes in this proposal -Deprecate element -Introduce new element, with type attribute representing combinations - ( h | hm | hms ). For example, +H:m;-H:m -Introduce new to store a locale specific separator used for offset patterns. Character colon (:) is reserved in patterns for locale specific separator and actual pattern is produced by replacing colon (:) with the separator character specified by element. -With above change, root.xml would be changed from -Old: - +HH:mm;-HH:mm -New: - +H;-H - +H:m;-H:m - +H:m:s;-H:m:s - : -The table below illustrates the behavior of long / short format, with the root data above. -UTC Offset Width Output Comment --8:00:00 long GMT-08:00 The negative pattern from , interpret 'H' as fixed 2 digits hour, replace ':' with -short GMT-8 The negative pattern from --8:30:00 long GMT-08:30 The negative pattern from , interpret 'H' as fixed 2 digits hour, replace ':' with -short GMT-8:30 The negative pattern from , interpret 'H' as variable width hour, replace ':' with --8:23:45 long GMT-08:23:45 The negative pattern from , interpret 'H' as fixed 2 digits hour, replace ':' with -short GMT-8:23:45 The negative pattern from , interpret 'H' as variable width hour, replace ':' with -"long" format always uses zero-padded 2 digits for offset hours field, such as "00", "08", "11". -"long" format does not use . -With above two, "long" format is expected to generates fixed length outputs practically (non-zero seconds offset is not used for modern dates). -"short" format always uses shortest offset hours field, such as "0", "8", "11". -"short" format uses the shortest pattern (h < hm < hms) without offset data loss. -Design considerations - uses single "H", "m", "s", because they just indicate the disposition of these fields. "H" is interpreted as date format pattern "HH" or "H" depending on the width context. -Many locales simply use the root data. Some locale may override only . -Some existing locale data do not use any separators (e.g. zh.xml). This can be represented by to be empty string. However, empty string as data does not fit well to CLDR structure, so such locale data require to provide at least and . -Some existing locale data uses U+2212 MINUS SIGN instead of U+002D HYPHEN-MINUS. These locales need to provide all of types. -Open Issues -Distinction of H and HH in the current locale data. -Some locales currently use single "H" in . - +H:mm;-H:mm (cs.xml) - +H.mm;-H.mm (fi.xml) -This proposal is trying to set a new assumption that "long" format to be practically fixed length, and long format always place leading zero for single digit hour value. If this assumption is not acceptable by these locales, then the design must be changed to allow "HH" or "H" in element, then "short" format to interpret "HH" as "H" (opposite way). However, I don't think this is the case. -Needs for long/short message pattern? -Although, ticket #5382 mentioned about offset part of localized GMT format, some locales may want to have two data in different length. For example, - Гриинуич{0} (bg.xml) - গ্রীনিচ মান সময় {0} (bn.xml) -There are some locales using relatively long patterns. If long/short distinction is given, these locales may want to provide shorter format such as "UTC{0}". -Impacts in CLDR ST -Because of another level of abstraction (separator, actual pattern width by context), this proposal may need a little bit more work on CLDR ST. \ No newline at end of file diff --git a/docs/site/TEMP-TEXT-FILES/math-formula-preferences.txt b/docs/site/TEMP-TEXT-FILES/math-formula-preferences.txt deleted file mode 100644 index 367c480e780..00000000000 --- a/docs/site/TEMP-TEXT-FILES/math-formula-preferences.txt +++ /dev/null @@ -1,21 +0,0 @@ -Math Formula Preferences -As outlined in http://unicode.org/cldr/trac/ticket/10100, -the directional flow for mathematical formulas can differ across bidirectional locales, as does the numbering system used for writing mathematical formulas. As we can see in the map below, some Arabic speaking prefer a left to right presentation for mathematical formulas, while others prefer right to left. Furthermore, the numbering system used in mathematical formulas may differ from the numbering system used for formatting regular numbers. -This proposal adds some additional structure to CLDR's DTD to allow applications to format mathematical formulas properly: -Under the "numbers" element, add a new element mathFormulaDirection as follows..... - - - -  -  -Under the "otherNumberingSystems" element, add an additional numbering system called "math", that can be used to handle those situations where the default numbering system for the locales differs from the numbering system used in mathematical formulas. We can and should document in tr35 , that if the "math" numbering system is not defined for a locale, then the default numbering system should be used - - - - -  -  -Given the information we have currently, the amount of new data needed in CLDR is fairly minimal. In root.xml, we would have: -mathFormulaDirection = "left-to-right", while ar.xml would have "right-to-left", which would cover the majority of Arabic speaking locales, but we would then add "left-to-right" in ar_MO.xml to cover Morocco. -Similarly, the vast majority of Arabic speaking locales would simply inherit their "math" numbering system from the default numbering system for the locale, and we would only need to explicitly specify a "math" numbering system where it differs from the default, for example, Yemen, Oman, Iraq. \ No newline at end of file