|
@@ -1,35 +1,38 @@ |
1 |
1 |
|
package org.litesoft.locale; |
2 |
2 |
|
|
3 |
|
- |
import java.util.HashMap; |
4 |
|
- |
import java.util.List; |
5 |
|
- |
import java.util.Map; |
6 |
|
- |
import java.util.Set; |
|
3 |
+ |
import java.util.*; |
7 |
4 |
|
|
8 |
5 |
|
@SuppressWarnings("Convert2Diamond") |
9 |
|
- |
public class DerivedLocaleGraph { |
|
6 |
+ |
public class DerivedLocaleGraph |
|
7 |
+ |
{ |
10 |
8 |
|
private static final AbstractLocale BASE = Locale_en_US.INSTANCE; |
11 |
9 |
|
private static final Map<String, AbstractLocale> DEFAULT_LOCALE_BY_LANGUAGE = new HashMap<String, AbstractLocale>(); |
12 |
10 |
|
private static final Map<String, AbstractLocale> LOCALE_BY_CODE = new HashMap<String, AbstractLocale>(); |
13 |
11 |
|
private static final Map<AbstractLocale, AbstractLocale> DERIVED_FROM_LOCALE_BY_LOCALE = new HashMap<AbstractLocale, AbstractLocale>(); |
14 |
12 |
|
|
15 |
|
- |
static { |
16 |
|
- |
addToDirectMaps(BASE); |
17 |
|
- |
add(Locale_en_US.INSTANCE, Locale_en_GB.INSTANCE, Locale_en_CA.INSTANCE); |
18 |
|
- |
add(Locale_es_ES.INSTANCE, Locale_es_MX.INSTANCE); |
19 |
|
- |
add(Locale_fr_FR.INSTANCE, Locale_fr_CA.INSTANCE); |
20 |
|
- |
add(Locale_zh_CN.INSTANCE, Locale_zh_TW.INSTANCE); |
21 |
|
- |
add(Locale_de_DE.INSTANCE); // , Locale_de_AT.INSTANCE, Locale_de_CH.INSTANCE ); |
22 |
|
- |
add(Locale_it_IT.INSTANCE); // , Locale_it_CH.INSTANCE ); |
23 |
|
- |
add(Locale_ja_JP.INSTANCE); |
24 |
|
- |
add(Locale_ko_KR.INSTANCE); |
|
13 |
+ |
static |
|
14 |
+ |
{ |
|
15 |
+ |
addToDirectMaps( BASE ); |
|
16 |
+ |
add( Locale_en_US.INSTANCE, Locale_en_GB.INSTANCE, Locale_en_CA.INSTANCE ); |
|
17 |
+ |
add( Locale_es_ES.INSTANCE, Locale_es_MX.INSTANCE ); |
|
18 |
+ |
add( Locale_fr_FR.INSTANCE, Locale_fr_CA.INSTANCE ); |
|
19 |
+ |
add( Locale_zh_CN.INSTANCE, Locale_zh_TW.INSTANCE ); |
|
20 |
+ |
add( Locale_de_DE.INSTANCE ); // , Locale_de_AT.INSTANCE, Locale_de_CH.INSTANCE ); |
|
21 |
+ |
add( Locale_it_IT.INSTANCE ); // , Locale_it_CH.INSTANCE ); |
|
22 |
+ |
add( Locale_ja_JP.INSTANCE ); |
|
23 |
+ |
add( Locale_ko_KR.INSTANCE ); |
25 |
24 |
|
} |
26 |
25 |
|
|
27 |
|
- |
public static AbstractLocale select(Set<AbstractLocale> pSupported, List<String> pOrderedCodes) { |
|
26 |
+ |
public static AbstractLocale select( Set<AbstractLocale> pSupported, List<String> pOrderedCodes ) |
|
27 |
+ |
{ |
28 |
28 |
|
AbstractLocale zBest = BASE; |
29 |
|
- |
if (pOrderedCodes != null) { |
30 |
|
- |
for (String zCode : pOrderedCodes) { |
31 |
|
- |
AbstractLocale zCandidate = candidateForFrom(zCode, pSupported); |
32 |
|
- |
if (zCandidate.mDepth > zBest.mDepth) { |
|
29 |
+ |
if ( pOrderedCodes != null ) |
|
30 |
+ |
{ |
|
31 |
+ |
for ( String zCode : pOrderedCodes ) |
|
32 |
+ |
{ |
|
33 |
+ |
AbstractLocale zCandidate = candidateForFrom( zCode, pSupported ); |
|
34 |
+ |
if ( zCandidate.mDepth > zBest.mDepth ) |
|
35 |
+ |
{ |
33 |
36 |
|
zBest = zCandidate; |
34 |
37 |
|
} |
35 |
38 |
|
} |
|
@@ -37,51 +40,65 @@ |
37 |
40 |
|
return zBest; |
38 |
41 |
|
} |
39 |
42 |
|
|
40 |
|
- |
private static AbstractLocale candidateForFrom(String pCode, Set<AbstractLocale> pSupported) { |
41 |
|
- |
AbstractLocale zLocale = LOCALE_BY_CODE.get(pCode); |
42 |
|
- |
if (null == zLocale) { |
43 |
|
- |
if (null == (zLocale = DEFAULT_LOCALE_BY_LANGUAGE.get(AbstractLocale.languageFrom(pCode)))) { |
|
43 |
+ |
private static AbstractLocale candidateForFrom( String pCode, Set<AbstractLocale> pSupported ) |
|
44 |
+ |
{ |
|
45 |
+ |
AbstractLocale zLocale = LOCALE_BY_CODE.get( pCode ); |
|
46 |
+ |
if ( null == zLocale ) |
|
47 |
+ |
{ |
|
48 |
+ |
if ( null == (zLocale = DEFAULT_LOCALE_BY_LANGUAGE.get( AbstractLocale.languageFrom( pCode ) )) ) |
|
49 |
+ |
{ |
44 |
50 |
|
return BASE; |
45 |
51 |
|
} |
46 |
52 |
|
} |
47 |
|
- |
while (!pSupported.contains(zLocale)) { |
48 |
|
- |
if (null == (zLocale = DERIVED_FROM_LOCALE_BY_LOCALE.get(zLocale))) { |
|
53 |
+ |
while ( !pSupported.contains( zLocale ) ) |
|
54 |
+ |
{ |
|
55 |
+ |
if ( null == (zLocale = DERIVED_FROM_LOCALE_BY_LOCALE.get( zLocale )) ) |
|
56 |
+ |
{ |
49 |
57 |
|
return BASE; |
50 |
58 |
|
} |
51 |
59 |
|
} |
52 |
60 |
|
return zLocale; |
53 |
61 |
|
} |
54 |
62 |
|
|
55 |
|
- |
public static void add(AbstractLocale pBaseOrDerivedFrom, AbstractLocale... pDerived) { |
56 |
|
- |
if (addToDirectMaps(pBaseOrDerivedFrom)) { |
57 |
|
- |
setDerived(BASE, pBaseOrDerivedFrom); |
|
63 |
+ |
public static void add( AbstractLocale pBaseOrDerivedFrom, AbstractLocale... pDerived ) |
|
64 |
+ |
{ |
|
65 |
+ |
if ( addToDirectMaps( pBaseOrDerivedFrom ) ) |
|
66 |
+ |
{ |
|
67 |
+ |
setDerived( BASE, pBaseOrDerivedFrom ); |
58 |
68 |
|
} |
59 |
|
- |
for (AbstractLocale zLocale : pDerived) { |
60 |
|
- |
addToDirectMaps(zLocale); |
61 |
|
- |
setDerived(pBaseOrDerivedFrom, zLocale); |
|
69 |
+ |
for ( AbstractLocale zLocale : pDerived ) |
|
70 |
+ |
{ |
|
71 |
+ |
addToDirectMaps( zLocale ); |
|
72 |
+ |
setDerived( pBaseOrDerivedFrom, zLocale ); |
62 |
73 |
|
} |
63 |
74 |
|
} |
64 |
75 |
|
|
65 |
|
- |
private static void setDerived(AbstractLocale pDerivedFrom, AbstractLocale pDerived) { |
|
76 |
+ |
private static void setDerived( AbstractLocale pDerivedFrom, AbstractLocale pDerived ) |
|
77 |
+ |
{ |
66 |
78 |
|
pDerived.mDepth = pDerivedFrom.mDepth + 1; |
67 |
|
- |
DERIVED_FROM_LOCALE_BY_LOCALE.put(pDerived, pDerivedFrom); |
|
79 |
+ |
DERIVED_FROM_LOCALE_BY_LOCALE.put( pDerived, pDerivedFrom ); |
68 |
80 |
|
} |
69 |
81 |
|
|
70 |
82 |
|
/** |
71 |
83 |
|
* @param pLocale !null |
|
84 |
+ |
* |
72 |
85 |
|
* @return true - If not already in the data structures |
73 |
86 |
|
*/ |
74 |
|
- |
private static boolean addToDirectMaps(AbstractLocale pLocale) { |
75 |
|
- |
if (null != LOCALE_BY_CODE.put(pLocale.getCode(), pLocale)) { |
|
87 |
+ |
private static boolean addToDirectMaps( AbstractLocale pLocale ) |
|
88 |
+ |
{ |
|
89 |
+ |
if ( null != LOCALE_BY_CODE.put( pLocale.getCode(), pLocale ) ) |
|
90 |
+ |
{ |
76 |
91 |
|
return false; // Already There! |
77 |
92 |
|
} |
78 |
93 |
|
// New, so might be the first of this language |
79 |
|
- |
if (!DEFAULT_LOCALE_BY_LANGUAGE.containsKey(pLocale.getLanguage())) { |
80 |
|
- |
DEFAULT_LOCALE_BY_LANGUAGE.put(pLocale.getLanguage(), pLocale); |
|
94 |
+ |
if ( !DEFAULT_LOCALE_BY_LANGUAGE.containsKey( pLocale.getLanguage() ) ) |
|
95 |
+ |
{ |
|
96 |
+ |
DEFAULT_LOCALE_BY_LANGUAGE.put( pLocale.getLanguage(), pLocale ); |
81 |
97 |
|
} |
82 |
98 |
|
return true; // Added |
83 |
99 |
|
} |
84 |
100 |
|
|
85 |
|
- |
private DerivedLocaleGraph() { |
|
101 |
+ |
private DerivedLocaleGraph() |
|
102 |
+ |
{ |
86 |
103 |
|
} |
87 |
104 |
|
} |