i18n+filtering fork - fluent-templates v2
at main 18 kB view raw
1use anyhow::{anyhow, Result}; 2use once_cell::sync::OnceCell; 3use std::{collections::BTreeMap, sync::Arc}; 4 5static COUNTRY_CACHE: OnceCell<Arc<BTreeMap<String, String>>> = OnceCell::new(); 6 7pub fn cached_countries<'a>() -> Result<&'a Arc<BTreeMap<String, String>>> { 8 if COUNTRY_CACHE.get().is_none() { 9 let all_countries: BTreeMap<String, String> = BTreeMap::from_iter( 10 [ 11 ("Afghanistan".to_string(), "AF".to_string()), 12 ("Åland Islands".to_string(), "AX".to_string()), 13 ("Albania".to_string(), "AL".to_string()), 14 ("Algeria".to_string(), "DZ".to_string()), 15 ("American Samoa".to_string(), "AS".to_string()), 16 ("Andorra".to_string(), "AD".to_string()), 17 ("Angola".to_string(), "AO".to_string()), 18 ("Anguilla".to_string(), "AI".to_string()), 19 ("Antarctica".to_string(), "AQ".to_string()), 20 ("Antigua and Barbuda".to_string(), "AG".to_string()), 21 ("Argentina".to_string(), "AR".to_string()), 22 ("Armenia".to_string(), "AM".to_string()), 23 ("Aruba".to_string(), "AW".to_string()), 24 ("Australia".to_string(), "AU".to_string()), 25 ("Austria".to_string(), "AT".to_string()), 26 ("Azerbaijan".to_string(), "AZ".to_string()), 27 ("Bahamas".to_string(), "BS".to_string()), 28 ("Bahrain".to_string(), "BH".to_string()), 29 ("Bangladesh".to_string(), "BD".to_string()), 30 ("Barbados".to_string(), "BB".to_string()), 31 ("Belarus".to_string(), "BY".to_string()), 32 ("Belgium".to_string(), "BE".to_string()), 33 ("Belize".to_string(), "BZ".to_string()), 34 ("Benin".to_string(), "BJ".to_string()), 35 ("Bermuda".to_string(), "BM".to_string()), 36 ("Bhutan".to_string(), "BT".to_string()), 37 ( 38 "Bolivia, Plurinational State of".to_string(), 39 "BO".to_string(), 40 ), 41 ( 42 "Bonaire, Sint Eustatius and Saba".to_string(), 43 "BQ".to_string(), 44 ), 45 ("Bosnia and Herzegovina".to_string(), "BA".to_string()), 46 ("Botswana".to_string(), "BW".to_string()), 47 ("Bouvet Island".to_string(), "BV".to_string()), 48 ("Brazil".to_string(), "BR".to_string()), 49 ( 50 "British Indian Ocean Territory".to_string(), 51 "IO".to_string(), 52 ), 53 ("Brunei Darussalam".to_string(), "BN".to_string()), 54 ("Bulgaria".to_string(), "BG".to_string()), 55 ("Burkina Faso".to_string(), "BF".to_string()), 56 ("Burundi".to_string(), "BI".to_string()), 57 ("Cabo Verde".to_string(), "CV".to_string()), 58 ("Cambodia".to_string(), "KH".to_string()), 59 ("Cameroon".to_string(), "CM".to_string()), 60 ("Canada".to_string(), "CA".to_string()), 61 ("Cayman Islands".to_string(), "KY".to_string()), 62 ("Central African Republic".to_string(), "CF".to_string()), 63 ("Chad".to_string(), "TD".to_string()), 64 ("Chile".to_string(), "CL".to_string()), 65 ("China".to_string(), "CN".to_string()), 66 ("Christmas Island".to_string(), "CX".to_string()), 67 ("Cocos (Keeling) Islands".to_string(), "CC".to_string()), 68 ("Colombia".to_string(), "CO".to_string()), 69 ("Comoros".to_string(), "KM".to_string()), 70 ("Congo".to_string(), "CG".to_string()), 71 ( 72 "Congo, Democratic Republic of the".to_string(), 73 "CD".to_string(), 74 ), 75 ("Cook Islands".to_string(), "CK".to_string()), 76 ("Costa Rica".to_string(), "CR".to_string()), 77 ("Côte d'Ivoire".to_string(), "CI".to_string()), 78 ("Croatia".to_string(), "HR".to_string()), 79 ("Cuba".to_string(), "CU".to_string()), 80 ("Curaçao".to_string(), "CW".to_string()), 81 ("Cyprus".to_string(), "CY".to_string()), 82 ("Czechia".to_string(), "CZ".to_string()), 83 ("Denmark".to_string(), "DK".to_string()), 84 ("Djibouti".to_string(), "DJ".to_string()), 85 ("Dominica".to_string(), "DM".to_string()), 86 ("Dominican Republic".to_string(), "DO".to_string()), 87 ("Ecuador".to_string(), "EC".to_string()), 88 ("Egypt".to_string(), "EG".to_string()), 89 ("El Salvador".to_string(), "SV".to_string()), 90 ("Equatorial Guinea".to_string(), "GQ".to_string()), 91 ("Eritrea".to_string(), "ER".to_string()), 92 ("Estonia".to_string(), "EE".to_string()), 93 ("Eswatini".to_string(), "SZ".to_string()), 94 ("Ethiopia".to_string(), "ET".to_string()), 95 ("Falkland Islands (Malvinas)".to_string(), "FK".to_string()), 96 ("Faroe Islands".to_string(), "FO".to_string()), 97 ("Fiji".to_string(), "FJ".to_string()), 98 ("Finland".to_string(), "FI".to_string()), 99 ("France".to_string(), "FR".to_string()), 100 ("French Guiana".to_string(), "GF".to_string()), 101 ("French Polynesia".to_string(), "PF".to_string()), 102 ("French Southern Territories".to_string(), "TF".to_string()), 103 ("Gabon".to_string(), "GA".to_string()), 104 ("Gambia".to_string(), "GM".to_string()), 105 ("Georgia".to_string(), "GE".to_string()), 106 ("Germany".to_string(), "DE".to_string()), 107 ("Ghana".to_string(), "GH".to_string()), 108 ("Gibraltar".to_string(), "GI".to_string()), 109 ("Greece".to_string(), "GR".to_string()), 110 ("Greenland".to_string(), "GL".to_string()), 111 ("Grenada".to_string(), "GD".to_string()), 112 ("Guadeloupe".to_string(), "GP".to_string()), 113 ("Guam".to_string(), "GU".to_string()), 114 ("Guatemala".to_string(), "GT".to_string()), 115 ("Guernsey".to_string(), "GG".to_string()), 116 ("Guinea".to_string(), "GN".to_string()), 117 ("Guinea-Bissau".to_string(), "GW".to_string()), 118 ("Guyana".to_string(), "GY".to_string()), 119 ("Haiti".to_string(), "HT".to_string()), 120 ( 121 "Heard Island and McDonald Islands".to_string(), 122 "HM".to_string(), 123 ), 124 ("Holy See".to_string(), "VA".to_string()), 125 ("Honduras".to_string(), "HN".to_string()), 126 ("Hong Kong".to_string(), "HK".to_string()), 127 ("Hungary".to_string(), "HU".to_string()), 128 ("Iceland".to_string(), "IS".to_string()), 129 ("India".to_string(), "IN".to_string()), 130 ("Indonesia".to_string(), "ID".to_string()), 131 ("Iran, Islamic Republic of".to_string(), "IR".to_string()), 132 ("Iraq".to_string(), "IQ".to_string()), 133 ("Ireland".to_string(), "IE".to_string()), 134 ("Isle of Man".to_string(), "IM".to_string()), 135 ("Israel".to_string(), "IL".to_string()), 136 ("Italy".to_string(), "IT".to_string()), 137 ("Jamaica".to_string(), "JM".to_string()), 138 ("Japan".to_string(), "JP".to_string()), 139 ("Jersey".to_string(), "JE".to_string()), 140 ("Jordan".to_string(), "JO".to_string()), 141 ("Kazakhstan".to_string(), "KZ".to_string()), 142 ("Kenya".to_string(), "KE".to_string()), 143 ("Kiribati".to_string(), "KI".to_string()), 144 ( 145 "Korea, Democratic People's Republic of".to_string(), 146 "KP".to_string(), 147 ), 148 ("Korea, Republic of".to_string(), "KR".to_string()), 149 ("Kuwait".to_string(), "KW".to_string()), 150 ("Kyrgyzstan".to_string(), "KG".to_string()), 151 ( 152 "Lao People's Democratic Republic".to_string(), 153 "LA".to_string(), 154 ), 155 ("Latvia".to_string(), "LV".to_string()), 156 ("Lebanon".to_string(), "LB".to_string()), 157 ("Lesotho".to_string(), "LS".to_string()), 158 ("Liberia".to_string(), "LR".to_string()), 159 ("Libya".to_string(), "LY".to_string()), 160 ("Liechtenstein".to_string(), "LI".to_string()), 161 ("Lithuania".to_string(), "LT".to_string()), 162 ("Luxembourg".to_string(), "LU".to_string()), 163 ("Macao".to_string(), "MO".to_string()), 164 ("Madagascar".to_string(), "MG".to_string()), 165 ("Malawi".to_string(), "MW".to_string()), 166 ("Malaysia".to_string(), "MY".to_string()), 167 ("Maldives".to_string(), "MV".to_string()), 168 ("Mali".to_string(), "ML".to_string()), 169 ("Malta".to_string(), "MT".to_string()), 170 ("Marshall Islands".to_string(), "MH".to_string()), 171 ("Martinique".to_string(), "MQ".to_string()), 172 ("Mauritania".to_string(), "MR".to_string()), 173 ("Mauritius".to_string(), "MU".to_string()), 174 ("Mayotte".to_string(), "YT".to_string()), 175 ("Mexico".to_string(), "MX".to_string()), 176 ( 177 "Micronesia, Federated States of".to_string(), 178 "FM".to_string(), 179 ), 180 ("Moldova, Republic of".to_string(), "MD".to_string()), 181 ("Monaco".to_string(), "MC".to_string()), 182 ("Mongolia".to_string(), "MN".to_string()), 183 ("Montenegro".to_string(), "ME".to_string()), 184 ("Montserrat".to_string(), "MS".to_string()), 185 ("Morocco".to_string(), "MA".to_string()), 186 ("Mozambique".to_string(), "MZ".to_string()), 187 ("Myanmar".to_string(), "MM".to_string()), 188 ("Namibia".to_string(), "NA".to_string()), 189 ("Nauru".to_string(), "NR".to_string()), 190 ("Nepal".to_string(), "NP".to_string()), 191 ("Netherlands, Kingdom of the".to_string(), "NL".to_string()), 192 ("New Caledonia".to_string(), "NC".to_string()), 193 ("New Zealand".to_string(), "NZ".to_string()), 194 ("Nicaragua".to_string(), "NI".to_string()), 195 ("Niger".to_string(), "NE".to_string()), 196 ("Nigeria".to_string(), "NG".to_string()), 197 ("Niue".to_string(), "NU".to_string()), 198 ("Norfolk Island".to_string(), "NF".to_string()), 199 ("North Macedonia".to_string(), "MK".to_string()), 200 ("Northern Mariana Islands".to_string(), "MP".to_string()), 201 ("Norway".to_string(), "NO".to_string()), 202 ("Oman".to_string(), "OM".to_string()), 203 ("Pakistan".to_string(), "PK".to_string()), 204 ("Palau".to_string(), "PW".to_string()), 205 ("Palestine, State of".to_string(), "PS".to_string()), 206 ("Panama".to_string(), "PA".to_string()), 207 ("Papua New Guinea".to_string(), "PG".to_string()), 208 ("Paraguay".to_string(), "PY".to_string()), 209 ("Peru".to_string(), "PE".to_string()), 210 ("Philippines".to_string(), "PH".to_string()), 211 ("Pitcairn".to_string(), "PN".to_string()), 212 ("Poland".to_string(), "PL".to_string()), 213 ("Portugal".to_string(), "PT".to_string()), 214 ("Puerto Rico".to_string(), "PR".to_string()), 215 ("Qatar".to_string(), "QA".to_string()), 216 ("Réunion".to_string(), "RE".to_string()), 217 ("Romania".to_string(), "RO".to_string()), 218 ("Russian Federation".to_string(), "RU".to_string()), 219 ("Rwanda".to_string(), "RW".to_string()), 220 ("Saint Barthélemy".to_string(), "BL".to_string()), 221 ( 222 "Saint Helena, Ascension and Tristan da Cunha".to_string(), 223 "SH".to_string(), 224 ), 225 ("Saint Kitts and Nevis".to_string(), "KN".to_string()), 226 ("Saint Lucia".to_string(), "LC".to_string()), 227 ("Saint Martin (French part)".to_string(), "MF".to_string()), 228 ("Saint Pierre and Miquelon".to_string(), "PM".to_string()), 229 ( 230 "Saint Vincent and the Grenadines".to_string(), 231 "VC".to_string(), 232 ), 233 ("Samoa".to_string(), "WS".to_string()), 234 ("San Marino".to_string(), "SM".to_string()), 235 ("Sao Tome and Principe".to_string(), "ST".to_string()), 236 ("Saudi Arabia".to_string(), "SA".to_string()), 237 ("Senegal".to_string(), "SN".to_string()), 238 ("Serbia".to_string(), "RS".to_string()), 239 ("Seychelles".to_string(), "SC".to_string()), 240 ("Sierra Leone".to_string(), "SL".to_string()), 241 ("Singapore".to_string(), "SG".to_string()), 242 ("Sint Maarten (Dutch part)".to_string(), "SX".to_string()), 243 ("Slovakia".to_string(), "SK".to_string()), 244 ("Slovenia".to_string(), "SI".to_string()), 245 ("Solomon Islands".to_string(), "SB".to_string()), 246 ("Somalia".to_string(), "SO".to_string()), 247 ("South Africa".to_string(), "ZA".to_string()), 248 ( 249 "South Georgia and the South Sandwich Islands".to_string(), 250 "GS".to_string(), 251 ), 252 ("South Sudan".to_string(), "SS".to_string()), 253 ("Spain".to_string(), "ES".to_string()), 254 ("Sri Lanka".to_string(), "LK".to_string()), 255 ("Sudan".to_string(), "SD".to_string()), 256 ("Suriname".to_string(), "SR".to_string()), 257 ("Svalbard and Jan Mayen".to_string(), "SJ".to_string()), 258 ("Sweden".to_string(), "SE".to_string()), 259 ("Switzerland".to_string(), "CH".to_string()), 260 ("Syrian Arab Republic".to_string(), "SY".to_string()), 261 ("Taiwan, Province of China".to_string(), "TW".to_string()), 262 ("Tajikistan".to_string(), "TJ".to_string()), 263 ("Tanzania, United Republic of".to_string(), "TZ".to_string()), 264 ("Thailand".to_string(), "TH".to_string()), 265 ("Timor-Leste".to_string(), "TL".to_string()), 266 ("Togo".to_string(), "TG".to_string()), 267 ("Tokelau".to_string(), "TK".to_string()), 268 ("Tonga".to_string(), "TO".to_string()), 269 ("Trinidad and Tobago".to_string(), "TT".to_string()), 270 ("Tunisia".to_string(), "TN".to_string()), 271 ("Türkiye".to_string(), "TR".to_string()), 272 ("Turkmenistan".to_string(), "TM".to_string()), 273 ("Turks and Caicos Islands".to_string(), "TC".to_string()), 274 ("Tuvalu".to_string(), "TV".to_string()), 275 ("Uganda".to_string(), "UG".to_string()), 276 ("Ukraine".to_string(), "UA".to_string()), 277 ("United Arab Emirates".to_string(), "AE".to_string()), 278 ( 279 "United Kingdom of Great Britain and Northern Ireland".to_string(), 280 "GB".to_string(), 281 ), 282 ("United States of America".to_string(), "US".to_string()), 283 ( 284 "United States Minor Outlying Islands".to_string(), 285 "UM".to_string(), 286 ), 287 ("Uruguay".to_string(), "UY".to_string()), 288 ("Uzbekistan".to_string(), "UZ".to_string()), 289 ("Vanuatu".to_string(), "VU".to_string()), 290 ( 291 "Venezuela, Bolivarian Republic of".to_string(), 292 "VE".to_string(), 293 ), 294 ("Viet Nam".to_string(), "VN".to_string()), 295 ("Virgin Islands (British)".to_string(), "VG".to_string()), 296 ("Virgin Islands (U.S.)".to_string(), "VI".to_string()), 297 ("Wallis and Futuna".to_string(), "WF".to_string()), 298 ("Western Sahara".to_string(), "EH".to_string()), 299 ("Yemen".to_string(), "YE".to_string()), 300 ("Zambia".to_string(), "ZM".to_string()), 301 ("Zimbabwe".to_string(), "ZW".to_string()), 302 ] 303 .iter() 304 // This is lazy, I know. 305 .map(|(name, code)| (code.clone(), name.clone())), 306 ); 307 let _ = COUNTRY_CACHE.set(Arc::new(all_countries)); 308 } 309 310 // Ensure we have a value, even in case of race conditions 311 if COUNTRY_CACHE.get().is_none() { 312 // In the unlikely event that another thread didn't successfully initialize, 313 // we'll try once more with a new map instance 314 let fallback_countries = BTreeMap::from([ 315 ("US".to_string(), "United States of America".to_string()), 316 ("GB".to_string(), "United Kingdom".to_string()), 317 ("CA".to_string(), "Canada".to_string()), 318 ]); 319 let _ = COUNTRY_CACHE.set(Arc::new(fallback_countries)); 320 } 321 322 // This should never fail now 323 COUNTRY_CACHE 324 .get() 325 .ok_or(anyhow!("COUNTRY_CACHE initialization failed")) 326}