diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0801d3d..1354df5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ jobs: runs-on: macOS-latest steps: - name: Check out code - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up JDK 21 uses: actions/setup-java@v5 @@ -26,16 +26,16 @@ jobs: uses: gradle/actions/setup-gradle@v5 - name: Run JVM tests - run: ./gradlew :deci:jvmTest + run: ./gradlew :countries-core:jvmTest :countries-i18n:jvmTest - name: Run iOS tests - run: ./gradlew :deci:iosSimulatorArm64Test + run: ./gradlew :countries-core:iosSimulatorArm64Test :countries-i18n:iosSimulatorArm64Test - name: Run JS tests - run: ./gradlew :deci:jsTest + run: ./gradlew :countries-core:jsTest :countries-i18n:jsTest - name: Run WasmJs tests - run: ./gradlew :deci:wasmJsTest + run: ./gradlew :countries-core:wasmJsTest :countries-i18n:wasmJsTest - name: Upload test reports if: always() @@ -43,8 +43,10 @@ jobs: with: name: test-reports path: | - deci/build/reports/tests/ - deci/build/test-results/ + countries-core/build/reports/tests/ + countries-core/build/test-results/ + countries-i18n/build/reports/tests/ + countries-i18n/build/test-results/ retention-days: 30 build: @@ -65,4 +67,4 @@ jobs: uses: gradle/actions/setup-gradle@v5 - name: Build library - run: ./gradlew build --no-configuration-cache + run: ./gradlew :countries-core:build :countries-i18n:build --no-configuration-cache diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 29aadee..128763b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -11,7 +11,7 @@ jobs: runs-on: macOS-latest steps: - name: Check out code - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up JDK 21 uses: actions/setup-java@v5 diff --git a/README.md b/README.md index 5553292..445abae 100644 --- a/README.md +++ b/README.md @@ -5,22 +5,23 @@ A lightweight, high-performance Kotlin Multiplatform library providing ISO 3166- ## Features - **249 Countries**: Complete ISO 3166-1 dataset with codes, names, and flags +- **Rich Metadata**: Continent, region, calling code, currency, and timezone for every country - **Native Names**: Authentic country names in local scripts (日本, Россия, مصر, etc.) -- **7 Languages**: Optional i18n module with Spanish, French, German, Arabic, Chinese, Russian +- **14 Languages**: Optional i18n module with ES, FR, DE, AR, ZH, RU, JA, PT, HI, KO, IT, TR, ID - **User-Friendly Names**: Display names without formal ISO formatting - **Type-Safe API**: Inline value classes for codes (zero runtime overhead) - **Multiple Access Patterns**: Repository, DSL queries, and extension functions - **Platform Support**: Android, iOS, JVM, JS, WASM -- **Minimal Size**: ~50KB core + ~50KB i18n (optional) +- **Minimal Size**: ~50KB core + ~100KB i18n (optional) - **Fast Performance**: O(1) hash-indexed lookups ## Installation ```kotlin dependencies { - implementation("org.kimplify:countries-core:0.1.0") + implementation("org.kimplify:countries-core:0.1.1") - // Optional: Multilingual support + // Optional: Multilingual support (14 languages) implementation("org.kimplify:countries-i18n:0.1.1") } ``` @@ -64,10 +65,24 @@ val northAmericans = Countries.repository.query { } }.toList() -// Count results -val count = Countries.repository.query { - nameStartsWith("United") -}.count() +// Filter by continent, region, calling code, currency, timezone +val europeanCountries = Countries.repository.query { + continent(Continent.EUROPE) +}.toList() + +val westernEurope = Countries.repository.query { + region(Region.WESTERN_EUROPE) +}.toList() + +// NOT logic +val nonEuropean = Countries.repository.query { + not { continent(Continent.EUROPE) } +}.toList() + +// Iterate directly (CountriesQueryResult implements Iterable) +for (country in Countries.repository.query { currency("EUR") }) { + println("${country.getDisplayName()} uses EUR") +} ``` ### Extension Functions @@ -86,6 +101,13 @@ val nativeName = "JP".nativeCountryName // "日本" // Convert between formats val alpha3 = "US".toAlpha3 // "USA" val alpha2 = "USA".toAlpha2 // "US" + +// Access metadata +val code = "US".callingCode // "+1" +val curr = "JP".currencyCode // "JPY" +val cont = "BR".continent // Continent.SOUTH_AMERICA +val reg = "BR".region // Region.SOUTH_AMERICA +val tz = "DE".timezone // "Europe/Berlin" ``` ## Data Model @@ -99,8 +121,13 @@ data class Country( val numeric: NumericCode, // ISO 3166-1 numeric (e.g., "840") val name: CountryName, // Formal ISO name (e.g., "United States of America (the)") val flag: FlagEmoji, // Flag emoji (e.g., "🇺🇸") - val displayName: String? = null, // User-friendly name (e.g., "United States") - val native: String? = null // Native language name (e.g., "日本") + val displayName: String?, // User-friendly name (e.g., "United States") + val native: String?, // Native language name (e.g., "日本") + val continent: Continent, // Geographic continent (e.g., NORTH_AMERICA) + val region: Region, // UN geoscheme region (e.g., NORTHERN_AMERICA) + val callingCode: CallingCode, // E.164 calling code (e.g., "+1") + val currency: CurrencyCode, // ISO 4217 currency (e.g., "USD") + val timezone: TimezoneId // IANA timezone (e.g., "America/New_York") ) ``` @@ -118,7 +145,15 @@ All codes are wrapped in inline value classes for type safety with zero runtime - `Alpha3Code`: 3-letter country code - `NumericCode`: 3-digit country code - `CountryName`: Country name string -- `FlagEmoji`: Flag emoji string +- `FlagEmoji`: Flag emoji (validated via Unicode codepoints) +- `CallingCode`: E.164 calling code (e.g., "+1", "+44") +- `CurrencyCode`: ISO 4217 currency code (e.g., "USD", "EUR") +- `TimezoneId`: IANA timezone identifier (e.g., "America/New_York") + +### Enums + +- `Continent`: 7 continents (AFRICA, ANTARCTICA, ASIA, EUROPE, NORTH_AMERICA, OCEANIA, SOUTH_AMERICA) +- `Region`: 23 UN geoscheme regions (CARIBBEAN, EASTERN_EUROPE, SOUTHEASTERN_ASIA, etc.) ## API Reference @@ -127,7 +162,7 @@ All codes are wrapped in inline value classes for type safety with zero runtime ```kotlin object Countries { val repository: CountriesRepository // Main data access point - const val VERSION: String // Library version + val VERSION: String // Library version (auto-generated from catalog) const val TOTAL_COUNTRIES: Int // Total countries (249) } ``` @@ -141,6 +176,10 @@ interface CountriesRepository { fun findByAlpha3(code: Alpha3Code): Country? fun findByNumeric(code: NumericCode): Country? fun searchByName(query: String): List + fun getByContinent(continent: Continent): List + fun getByRegion(region: Region): List + fun getByCallingCode(callingCode: CallingCode): List + fun getByCurrency(currencyCode: CurrencyCode): List fun query(block: CountriesQuery.() -> Unit): CountriesQueryResult } ``` @@ -148,6 +187,7 @@ interface CountriesRepository { ### DSL Query Builder ```kotlin +@CountriesDsl class CountriesQuery { fun alpha2(code: String) fun alpha3(code: String) @@ -155,10 +195,16 @@ class CountriesQuery { fun nameContains(text: String) fun nameEquals(name: String) fun nameStartsWith(prefix: String) + fun continent(continent: Continent) + fun region(region: Region) + fun callingCode(code: String) + fun currency(code: String) + fun timezone(id: String) fun or(block: CountriesQuery.() -> Unit) + fun not(block: CountriesQuery.() -> Unit) } -class CountriesQueryResult { +class CountriesQueryResult : Iterable { fun firstOrNull(): Country? fun first(): Country fun toList(): List @@ -170,8 +216,8 @@ class CountriesQueryResult { ## Performance -- **Core library**: ~50KB (249 countries with native names) -- **I18n module**: ~50KB (6 languages × 250 translations) +- **Core library**: ~80KB (249 countries with native names + metadata) +- **I18n module**: ~100KB (13 languages × 249 translations) - **Initialization**: <10ms (lazy) - **Lookups**: O(1) hash-indexed, <1ms - **Translations**: O(1) map lookup @@ -198,13 +244,13 @@ No platform-specific code needed! ## Versioning Semantic versioning: `MAJOR.MINOR.PATCH` -- **Current**: 1.0.0 -- **Data updates**: MINOR bump (e.g., 1.1.0) -- **API changes**: MAJOR bump (e.g., 2.0.0) +- **Current**: 0.1.1 +- **Data updates**: MINOR bump +- **API changes**: MAJOR bump ## Internationalization (countries-i18n) -Optional module providing country name translations in 6 languages. +Optional module providing country name translations in 13 languages (+ English fallback). ```kotlin val country = Countries.repository.findByAlpha2(Alpha2Code("JP"))!! @@ -216,12 +262,24 @@ country.getLocalizedName(Locale.DE) // "Japan" country.getLocalizedName(Locale.AR) // "اليابان" country.getLocalizedName(Locale.ZH) // "日本" country.getLocalizedName(Locale.RU) // "Япония" +country.getLocalizedName(Locale.JA) // "日本" +country.getLocalizedName(Locale.PT) // "Japão" +country.getLocalizedName(Locale.KO) // "일본" +country.getLocalizedName(Locale.IT) // "Giappone" +country.getLocalizedName(Locale.TR) // "Japonya" +country.getLocalizedName(Locale.HI) // "जापान" +country.getLocalizedName(Locale.ID) // "Jepang" + +// Locale strings are normalized automatically +country.getLocalizedName("es-MX") // "Japón" (extracts "es") +country.getLocalizedName("PT_BR") // "Japão" (extracts "pt") ``` **Supported Languages:** -- English (en), Spanish (es), French (fr), German (de) -- Arabic (ar) with RTL support -- Chinese (zh), Russian (ru) +- English (en), Spanish (es), French (fr), German (de), Italian (it) +- Arabic (ar) with RTL support, Turkish (tr), Indonesian (id) +- Chinese (zh), Japanese (ja), Korean (ko), Hindi (hi) +- Russian (ru), Portuguese (pt) See [countries-i18n/README.md](countries-i18n/README.md) for full documentation. @@ -238,4 +296,5 @@ See [countries-i18n/README.md](countries-i18n/README.md) for full documentation. - **Standard**: ISO 3166-1:2020 - **Total Entries**: 249 territories - **Includes**: 193 UN member states + 56 dependencies/special areas +- **Metadata Sources**: UN M49 (regions), ITU-T E.164 (calling codes), ISO 4217 (currencies), IANA (timezones) - **Last Updated**: 2025-01-26 diff --git a/countries-core/build.gradle.kts b/countries-core/build.gradle.kts index 8dfed23..5e933ba 100644 --- a/countries-core/build.gradle.kts +++ b/countries-core/build.gradle.kts @@ -53,12 +53,35 @@ kotlin { } } +val generateVersionFile = tasks.register("generateVersionFile") { + val version = libs.versions.kcountries.get() + val outputDir = layout.buildDirectory.dir("generated/version/kotlin") + outputs.dir(outputDir) + doLast { + val dir = outputDir.get().asFile.resolve("org/kimplify/countries") + dir.mkdirs() + dir.resolve("BuildKConfig.kt").writeText( + """ + |package org.kimplify.countries + | + |internal object BuildKConfig { + | const val VERSION = "$version" + |} + """.trimMargin() + ) + } +} + +kotlin.sourceSets.commonMain { + kotlin.srcDir(generateVersionFile.map { it.outputs.files.singleFile }) +} + android { namespace = "org.kimplify.countriesCore" - compileSdk = 35 + compileSdk = libs.versions.android.compileSdk.get().toInt() defaultConfig { - minSdk = 21 + minSdk = libs.versions.android.minSdk.get().toInt() } } diff --git a/countries-core/src/commonMain/kotlin/org/kimplify/countries/Countries.kt b/countries-core/src/commonMain/kotlin/org/kimplify/countries/Countries.kt index 43ac73a..3f7bb21 100644 --- a/countries-core/src/commonMain/kotlin/org/kimplify/countries/Countries.kt +++ b/countries-core/src/commonMain/kotlin/org/kimplify/countries/Countries.kt @@ -39,7 +39,7 @@ object Countries { /** * Library version following semantic versioning (MAJOR.MINOR.PATCH). */ - const val VERSION = "1.0.0" + val VERSION = BuildKConfig.VERSION /** * Total number of countries in the ISO 3166-1 dataset. diff --git a/countries-core/src/commonMain/kotlin/org/kimplify/countries/data/CountriesData.kt b/countries-core/src/commonMain/kotlin/org/kimplify/countries/data/CountriesData.kt index bcffda5..f686e00 100644 --- a/countries-core/src/commonMain/kotlin/org/kimplify/countries/data/CountriesData.kt +++ b/countries-core/src/commonMain/kotlin/org/kimplify/countries/data/CountriesData.kt @@ -12,2037 +12,1747 @@ import org.kimplify.countries.model.* internal object CountriesData { val countries: List = listOf( Country( - alpha2 = Alpha2Code("AD"), - alpha3 = Alpha3Code("AND"), - numeric = NumericCode("020"), - name = CountryName("Andorra"), - flag = FlagEmoji("🇦🇩"), - native = "Andorra" + alpha2 = Alpha2Code("AD"), alpha3 = Alpha3Code("AND"), numeric = NumericCode("020"), + name = CountryName("Andorra"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDE9"), + native = "Andorra", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+376"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Andorra") ), - Country( - alpha2 = Alpha2Code("AE"), - alpha3 = Alpha3Code("ARE"), - numeric = NumericCode("784"), - name = CountryName("United Arab Emirates (the)"), - flag = FlagEmoji("🇦🇪"), - displayName = "United Arab Emirates", - native = "الإمارات العربية المتحدة" - ), - Country( - alpha2 = Alpha2Code("AF"), - alpha3 = Alpha3Code("AFG"), - numeric = NumericCode("004"), - name = CountryName("Afghanistan"), - flag = FlagEmoji("🇦🇫"), - native = "افغانستان" - ), - Country( - alpha2 = Alpha2Code("AG"), - alpha3 = Alpha3Code("ATG"), - numeric = NumericCode("028"), - name = CountryName("Antigua and Barbuda"), - flag = FlagEmoji("🇦🇬"), - native = "Antigua and Barbuda" - ), - Country( - alpha2 = Alpha2Code("AI"), - alpha3 = Alpha3Code("AIA"), - numeric = NumericCode("660"), - name = CountryName("Anguilla"), - flag = FlagEmoji("🇦🇮"), - native = "Anguilla" - ), - Country( - alpha2 = Alpha2Code("AL"), - alpha3 = Alpha3Code("ALB"), - numeric = NumericCode("008"), - name = CountryName("Albania"), - flag = FlagEmoji("🇦🇱"), - native = "Shqipëria" - ), - Country( - alpha2 = Alpha2Code("AM"), - alpha3 = Alpha3Code("ARM"), - numeric = NumericCode("051"), - name = CountryName("Armenia"), - flag = FlagEmoji("🇦🇲"), - native = "Հայաստան" - ), - Country( - alpha2 = Alpha2Code("AO"), - alpha3 = Alpha3Code("AGO"), - numeric = NumericCode("024"), - name = CountryName("Angola"), - flag = FlagEmoji("🇦🇴"), - native = "Angola" - ), - Country( - alpha2 = Alpha2Code("AQ"), - alpha3 = Alpha3Code("ATA"), - numeric = NumericCode("010"), - name = CountryName("Antarctica"), - flag = FlagEmoji("🇦🇶"), - native = "Antarctica" - ), - Country( - alpha2 = Alpha2Code("AR"), - alpha3 = Alpha3Code("ARG"), - numeric = NumericCode("032"), - name = CountryName("Argentina"), - flag = FlagEmoji("🇦🇷"), - native = "Argentina" - ), - Country( - alpha2 = Alpha2Code("AS"), - alpha3 = Alpha3Code("ASM"), - numeric = NumericCode("016"), - name = CountryName("American Samoa"), - flag = FlagEmoji("🇦🇸"), - native = "American Samoa" - ), - Country( - alpha2 = Alpha2Code("AT"), - alpha3 = Alpha3Code("AUT"), - numeric = NumericCode("040"), - name = CountryName("Austria"), - flag = FlagEmoji("🇦🇹"), - native = "Österreich" - ), - Country( - alpha2 = Alpha2Code("AU"), - alpha3 = Alpha3Code("AUS"), - numeric = NumericCode("036"), - name = CountryName("Australia"), - flag = FlagEmoji("🇦🇺"), - native = "Australia" + Country( + alpha2 = Alpha2Code("AE"), alpha3 = Alpha3Code("ARE"), numeric = NumericCode("784"), + name = CountryName("United Arab Emirates (the)"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDEA"), + displayName = "United Arab Emirates", native = "\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062A \u0627\u0644\u0639\u0631\u0628\u064A\u0629 \u0627\u0644\u0645\u062A\u062D\u062F\u0629", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+971"), currency = CurrencyCode("AED"), timezone = TimezoneId("Asia/Dubai") ), Country( - alpha2 = Alpha2Code("AW"), - alpha3 = Alpha3Code("ABW"), - numeric = NumericCode("533"), - name = CountryName("Aruba"), - flag = FlagEmoji("🇦🇼"), - native = "Aruba" + alpha2 = Alpha2Code("AF"), alpha3 = Alpha3Code("AFG"), numeric = NumericCode("004"), + name = CountryName("Afghanistan"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDEB"), + native = "\u0627\u0641\u063A\u0627\u0646\u0633\u062A\u0627\u0646", + continent = Continent.ASIA, region = Region.SOUTHERN_ASIA, + callingCode = CallingCode("+93"), currency = CurrencyCode("AFN"), timezone = TimezoneId("Asia/Kabul") ), Country( - alpha2 = Alpha2Code("AX"), - alpha3 = Alpha3Code("ALA"), - numeric = NumericCode("248"), - name = CountryName("Åland Islands"), - flag = FlagEmoji("🇦🇽"), - native = "Åland" + alpha2 = Alpha2Code("AG"), alpha3 = Alpha3Code("ATG"), numeric = NumericCode("028"), + name = CountryName("Antigua and Barbuda"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDEC"), + native = "Antigua and Barbuda", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("XCD"), timezone = TimezoneId("America/Antigua") ), Country( - alpha2 = Alpha2Code("AZ"), - alpha3 = Alpha3Code("AZE"), - numeric = NumericCode("031"), - name = CountryName("Azerbaijan"), - flag = FlagEmoji("🇦🇿"), - native = "Azərbaycan" + alpha2 = Alpha2Code("AI"), alpha3 = Alpha3Code("AIA"), numeric = NumericCode("660"), + name = CountryName("Anguilla"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDEE"), + native = "Anguilla", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("XCD"), timezone = TimezoneId("America/Anguilla") ), Country( - alpha2 = Alpha2Code("BA"), - alpha3 = Alpha3Code("BIH"), - numeric = NumericCode("070"), - name = CountryName("Bosnia and Herzegovina"), - flag = FlagEmoji("🇧🇦"), - native = "Bosna i Hercegovina" + alpha2 = Alpha2Code("AL"), alpha3 = Alpha3Code("ALB"), numeric = NumericCode("008"), + name = CountryName("Albania"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDF1"), + native = "Shqip\u00EBria", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+355"), currency = CurrencyCode("ALL"), timezone = TimezoneId("Europe/Tirane") ), Country( - alpha2 = Alpha2Code("BB"), - alpha3 = Alpha3Code("BRB"), - numeric = NumericCode("052"), - name = CountryName("Barbados"), - flag = FlagEmoji("🇧🇧"), - native = "Barbados" + alpha2 = Alpha2Code("AM"), alpha3 = Alpha3Code("ARM"), numeric = NumericCode("051"), + name = CountryName("Armenia"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDF2"), + native = "\u0540\u0561\u0575\u0561\u057D\u057F\u0561\u0576", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+374"), currency = CurrencyCode("AMD"), timezone = TimezoneId("Asia/Yerevan") ), Country( - alpha2 = Alpha2Code("BD"), - alpha3 = Alpha3Code("BGD"), - numeric = NumericCode("050"), - name = CountryName("Bangladesh"), - flag = FlagEmoji("🇧🇩"), - native = "বাংলাদেশ" + alpha2 = Alpha2Code("AO"), alpha3 = Alpha3Code("AGO"), numeric = NumericCode("024"), + name = CountryName("Angola"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDF4"), + native = "Angola", + continent = Continent.AFRICA, region = Region.MIDDLE_AFRICA, + callingCode = CallingCode("+244"), currency = CurrencyCode("AOA"), timezone = TimezoneId("Africa/Luanda") ), Country( - alpha2 = Alpha2Code("BE"), - alpha3 = Alpha3Code("BEL"), - numeric = NumericCode("056"), - name = CountryName("Belgium"), - flag = FlagEmoji("🇧🇪"), - native = "Belgien" + alpha2 = Alpha2Code("AQ"), alpha3 = Alpha3Code("ATA"), numeric = NumericCode("010"), + name = CountryName("Antarctica"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDF6"), + native = "Antarctica", + continent = Continent.ANTARCTICA, region = Region.ANTARCTICA, + callingCode = CallingCode("+672"), currency = CurrencyCode("USD"), timezone = TimezoneId("Antarctica/Palmer") ), Country( - alpha2 = Alpha2Code("BF"), - alpha3 = Alpha3Code("BFA"), - numeric = NumericCode("854"), - name = CountryName("Burkina Faso"), - flag = FlagEmoji("🇧🇫"), - native = "Burkina Faso" + alpha2 = Alpha2Code("AR"), alpha3 = Alpha3Code("ARG"), numeric = NumericCode("032"), + name = CountryName("Argentina"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDF7"), + native = "Argentina", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+54"), currency = CurrencyCode("ARS"), timezone = TimezoneId("America/Argentina/Buenos_Aires") ), Country( - alpha2 = Alpha2Code("BG"), - alpha3 = Alpha3Code("BGR"), - numeric = NumericCode("100"), - name = CountryName("Bulgaria"), - flag = FlagEmoji("🇧🇬"), - native = "България" + alpha2 = Alpha2Code("AS"), alpha3 = Alpha3Code("ASM"), numeric = NumericCode("016"), + name = CountryName("American Samoa"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDF8"), + native = "American Samoa", + continent = Continent.OCEANIA, region = Region.POLYNESIA, + callingCode = CallingCode("+1"), currency = CurrencyCode("USD"), timezone = TimezoneId("Pacific/Pago_Pago") ), Country( - alpha2 = Alpha2Code("BH"), - alpha3 = Alpha3Code("BHR"), - numeric = NumericCode("048"), - name = CountryName("Bahrain"), - flag = FlagEmoji("🇧🇭"), - native = "‏البحرين" + alpha2 = Alpha2Code("AT"), alpha3 = Alpha3Code("AUT"), numeric = NumericCode("040"), + name = CountryName("Austria"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDF9"), + native = "\u00D6sterreich", + continent = Continent.EUROPE, region = Region.WESTERN_EUROPE, + callingCode = CallingCode("+43"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Vienna") ), Country( - alpha2 = Alpha2Code("BI"), - alpha3 = Alpha3Code("BDI"), - numeric = NumericCode("108"), - name = CountryName("Burundi"), - flag = FlagEmoji("🇧🇮"), - native = "Burundi" + alpha2 = Alpha2Code("AU"), alpha3 = Alpha3Code("AUS"), numeric = NumericCode("036"), + name = CountryName("Australia"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDFA"), + native = "Australia", + continent = Continent.OCEANIA, region = Region.AUSTRALIA_AND_NEW_ZEALAND, + callingCode = CallingCode("+61"), currency = CurrencyCode("AUD"), timezone = TimezoneId("Australia/Sydney") ), Country( - alpha2 = Alpha2Code("BJ"), - alpha3 = Alpha3Code("BEN"), - numeric = NumericCode("204"), - name = CountryName("Benin"), - flag = FlagEmoji("🇧🇯"), - native = "Bénin" + alpha2 = Alpha2Code("AW"), alpha3 = Alpha3Code("ABW"), numeric = NumericCode("533"), + name = CountryName("Aruba"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDFC"), + native = "Aruba", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+297"), currency = CurrencyCode("AWG"), timezone = TimezoneId("America/Aruba") ), Country( - alpha2 = Alpha2Code("BL"), - alpha3 = Alpha3Code("BLM"), - numeric = NumericCode("652"), - name = CountryName("Saint Barthélemy"), - flag = FlagEmoji("🇧🇱"), - native = "Saint-Barthélemy" + alpha2 = Alpha2Code("AX"), alpha3 = Alpha3Code("ALA"), numeric = NumericCode("248"), + name = CountryName("\u00C5land Islands"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDFD"), + native = "\u00C5land", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+358"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Mariehamn") ), Country( - alpha2 = Alpha2Code("BM"), - alpha3 = Alpha3Code("BMU"), - numeric = NumericCode("060"), - name = CountryName("Bermuda"), - flag = FlagEmoji("🇧🇲"), - native = "Bermuda" - ), + alpha2 = Alpha2Code("AZ"), alpha3 = Alpha3Code("AZE"), numeric = NumericCode("031"), + name = CountryName("Azerbaijan"), flag = FlagEmoji("\uD83C\uDDE6\uD83C\uDDFF"), + native = "Az\u0259rbaycan", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+994"), currency = CurrencyCode("AZN"), timezone = TimezoneId("Asia/Baku") + ), Country( - alpha2 = Alpha2Code("BN"), - alpha3 = Alpha3Code("BRN"), - numeric = NumericCode("096"), - name = CountryName("Brunei Darussalam"), - flag = FlagEmoji("🇧🇳"), - displayName = "Brunei", - native = "Brunei" - ), + alpha2 = Alpha2Code("BA"), alpha3 = Alpha3Code("BIH"), numeric = NumericCode("070"), + name = CountryName("Bosnia and Herzegovina"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDE6"), + native = "Bosna i Hercegovina", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+387"), currency = CurrencyCode("BAM"), timezone = TimezoneId("Europe/Sarajevo") + ), Country( - alpha2 = Alpha2Code("BO"), - alpha3 = Alpha3Code("BOL"), - numeric = NumericCode("068"), - name = CountryName("Bolivia (Plurinational State of)"), - flag = FlagEmoji("🇧🇴"), - displayName = "Bolivia", - native = "Bolivia" - ), + alpha2 = Alpha2Code("BB"), alpha3 = Alpha3Code("BRB"), numeric = NumericCode("052"), + name = CountryName("Barbados"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDE7"), + native = "Barbados", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("BBD"), timezone = TimezoneId("America/Barbados") + ), Country( - alpha2 = Alpha2Code("BQ"), - alpha3 = Alpha3Code("BES"), - numeric = NumericCode("535"), - name = CountryName("Bonaire, Sint Eustatius and Saba"), - flag = FlagEmoji("🇧🇶"), - native = "Caribisch Nederland" - ), - Country( - alpha2 = Alpha2Code("BR"), - alpha3 = Alpha3Code("BRA"), - numeric = NumericCode("076"), - name = CountryName("Brazil"), - flag = FlagEmoji("🇧🇷"), - native = "Brasil" - ), - Country( - alpha2 = Alpha2Code("BS"), - alpha3 = Alpha3Code("BHS"), - numeric = NumericCode("044"), - name = CountryName("Bahamas (the)"), - flag = FlagEmoji("🇧🇸"), - displayName = "Bahamas", - native = "Bahamas" - ), + alpha2 = Alpha2Code("BD"), alpha3 = Alpha3Code("BGD"), numeric = NumericCode("050"), + name = CountryName("Bangladesh"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDE9"), + native = "\u09AC\u09BE\u0982\u09B2\u09BE\u09A6\u09C7\u09B6", + continent = Continent.ASIA, region = Region.SOUTHERN_ASIA, + callingCode = CallingCode("+880"), currency = CurrencyCode("BDT"), timezone = TimezoneId("Asia/Dhaka") + ), Country( - alpha2 = Alpha2Code("BT"), - alpha3 = Alpha3Code("BTN"), - numeric = NumericCode("064"), - name = CountryName("Bhutan"), - flag = FlagEmoji("🇧🇹"), - native = "འབྲུག་ཡུལ་" - ), - Country( - alpha2 = Alpha2Code("BV"), - alpha3 = Alpha3Code("BVT"), - numeric = NumericCode("074"), - name = CountryName("Bouvet Island"), - flag = FlagEmoji("🇧🇻"), - native = "Bouvetøya" - ), - Country( - alpha2 = Alpha2Code("BW"), - alpha3 = Alpha3Code("BWA"), - numeric = NumericCode("072"), - name = CountryName("Botswana"), - flag = FlagEmoji("🇧🇼"), - native = "Botswana" - ), - Country( - alpha2 = Alpha2Code("BY"), - alpha3 = Alpha3Code("BLR"), - numeric = NumericCode("112"), - name = CountryName("Belarus"), - flag = FlagEmoji("🇧🇾"), - native = "Белару́сь" - ), - Country( - alpha2 = Alpha2Code("BZ"), - alpha3 = Alpha3Code("BLZ"), - numeric = NumericCode("084"), - name = CountryName("Belize"), - flag = FlagEmoji("🇧🇿"), - native = "Belize" - ), - Country( - alpha2 = Alpha2Code("CA"), - alpha3 = Alpha3Code("CAN"), - numeric = NumericCode("124"), - name = CountryName("Canada"), - flag = FlagEmoji("🇨🇦"), - native = "Canada" - ), - Country( - alpha2 = Alpha2Code("CC"), - alpha3 = Alpha3Code("CCK"), - numeric = NumericCode("166"), - name = CountryName("Cocos (Keeling) Islands (the)"), - flag = FlagEmoji("🇨🇨"), - displayName = "Cocos (Keeling) Islands", - native = "Cocos (Keeling) Islands" - ), - Country( - alpha2 = Alpha2Code("CD"), - alpha3 = Alpha3Code("COD"), - numeric = NumericCode("180"), - name = CountryName("Congo (the Democratic Republic of the)"), - flag = FlagEmoji("🇨🇩"), - displayName = "Democratic Republic of the Congo", - native = "République démocratique du Congo" + alpha2 = Alpha2Code("BE"), alpha3 = Alpha3Code("BEL"), numeric = NumericCode("056"), + name = CountryName("Belgium"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDEA"), + native = "Belgi\u00EB / Belgique", + continent = Continent.EUROPE, region = Region.WESTERN_EUROPE, + callingCode = CallingCode("+32"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Brussels") ), - Country( - alpha2 = Alpha2Code("CF"), - alpha3 = Alpha3Code("CAF"), - numeric = NumericCode("140"), - name = CountryName("Central African Republic (the)"), - flag = FlagEmoji("🇨🇫"), - displayName = "Central African Republic", - native = "République centrafricaine" + Country( + alpha2 = Alpha2Code("BF"), alpha3 = Alpha3Code("BFA"), numeric = NumericCode("854"), + name = CountryName("Burkina Faso"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDEB"), + native = "Burkina Faso", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+226"), currency = CurrencyCode("XOF"), timezone = TimezoneId("Africa/Ouagadougou") ), - Country( - alpha2 = Alpha2Code("CG"), - alpha3 = Alpha3Code("COG"), - numeric = NumericCode("178"), - name = CountryName("Congo (the)"), - flag = FlagEmoji("🇨🇬"), - displayName = "Republic of the Congo", - native = "République du Congo" - ), - Country( - alpha2 = Alpha2Code("CH"), - alpha3 = Alpha3Code("CHE"), - numeric = NumericCode("756"), - name = CountryName("Switzerland"), - flag = FlagEmoji("🇨🇭"), - native = "Suisse" - ), - Country( - alpha2 = Alpha2Code("CI"), - alpha3 = Alpha3Code("CIV"), - numeric = NumericCode("384"), - name = CountryName("Côte d'Ivoire"), - flag = FlagEmoji("🇨🇮"), - native = "Côte d'Ivoire" + Country( + alpha2 = Alpha2Code("BG"), alpha3 = Alpha3Code("BGR"), numeric = NumericCode("100"), + name = CountryName("Bulgaria"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDEC"), + native = "\u0411\u044A\u043B\u0433\u0430\u0440\u0438\u044F", + continent = Continent.EUROPE, region = Region.EASTERN_EUROPE, + callingCode = CallingCode("+359"), currency = CurrencyCode("BGN"), timezone = TimezoneId("Europe/Sofia") ), - Country( - alpha2 = Alpha2Code("CK"), - alpha3 = Alpha3Code("COK"), - numeric = NumericCode("184"), - name = CountryName("Cook Islands (the)"), - flag = FlagEmoji("🇨🇰"), - displayName = "Cook Islands", - native = "Cook Islands" - ), - Country( - alpha2 = Alpha2Code("CL"), - alpha3 = Alpha3Code("CHL"), - numeric = NumericCode("152"), - name = CountryName("Chile"), - flag = FlagEmoji("🇨🇱"), - native = "Chile" - ), - Country( - alpha2 = Alpha2Code("CM"), - alpha3 = Alpha3Code("CMR"), - numeric = NumericCode("120"), - name = CountryName("Cameroon"), - flag = FlagEmoji("🇨🇲"), - native = "Cameroon" - ), - Country( - alpha2 = Alpha2Code("CN"), - alpha3 = Alpha3Code("CHN"), - numeric = NumericCode("156"), - name = CountryName("China"), - flag = FlagEmoji("🇨🇳"), - native = "中国" - ), - Country( - alpha2 = Alpha2Code("CO"), - alpha3 = Alpha3Code("COL"), - numeric = NumericCode("170"), - name = CountryName("Colombia"), - flag = FlagEmoji("🇨🇴"), - native = "Colombia" - ), - Country( - alpha2 = Alpha2Code("CR"), - alpha3 = Alpha3Code("CRI"), - numeric = NumericCode("188"), - name = CountryName("Costa Rica"), - flag = FlagEmoji("🇨🇷"), - native = "Costa Rica" - ), - Country( - alpha2 = Alpha2Code("CU"), - alpha3 = Alpha3Code("CUB"), - numeric = NumericCode("192"), - name = CountryName("Cuba"), - flag = FlagEmoji("🇨🇺"), - native = "Cuba" + Country( + alpha2 = Alpha2Code("BH"), alpha3 = Alpha3Code("BHR"), numeric = NumericCode("048"), + name = CountryName("Bahrain"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDED"), + native = "\u200F\u0627\u0644\u0628\u062D\u0631\u064A\u0646", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+973"), currency = CurrencyCode("BHD"), timezone = TimezoneId("Asia/Bahrain") ), - Country( - alpha2 = Alpha2Code("CV"), - alpha3 = Alpha3Code("CPV"), - numeric = NumericCode("132"), - name = CountryName("Cabo Verde"), - flag = FlagEmoji("🇨🇻"), - native = "Cabo Verde" + Country( + alpha2 = Alpha2Code("BI"), alpha3 = Alpha3Code("BDI"), numeric = NumericCode("108"), + name = CountryName("Burundi"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDEE"), + native = "Burundi", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+257"), currency = CurrencyCode("BIF"), timezone = TimezoneId("Africa/Bujumbura") ), Country( - alpha2 = Alpha2Code("CW"), - alpha3 = Alpha3Code("CUW"), - numeric = NumericCode("531"), - name = CountryName("Curaçao"), - flag = FlagEmoji("🇨🇼"), - native = "Curaçao" + alpha2 = Alpha2Code("BJ"), alpha3 = Alpha3Code("BEN"), numeric = NumericCode("204"), + name = CountryName("Benin"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDEF"), + native = "B\u00E9nin", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+229"), currency = CurrencyCode("XOF"), timezone = TimezoneId("Africa/Porto-Novo") ), Country( - alpha2 = Alpha2Code("CX"), - alpha3 = Alpha3Code("CXR"), - numeric = NumericCode("162"), - name = CountryName("Christmas Island"), - flag = FlagEmoji("🇨🇽"), - native = "Christmas Island" + alpha2 = Alpha2Code("BL"), alpha3 = Alpha3Code("BLM"), numeric = NumericCode("652"), + name = CountryName("Saint Barth\u00E9lemy"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDF1"), + native = "Saint-Barth\u00E9lemy", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+590"), currency = CurrencyCode("EUR"), timezone = TimezoneId("America/St_Barthelemy") ), Country( - alpha2 = Alpha2Code("CY"), - alpha3 = Alpha3Code("CYP"), - numeric = NumericCode("196"), - name = CountryName("Cyprus"), - flag = FlagEmoji("🇨🇾"), - native = "Κύπρος" + alpha2 = Alpha2Code("BM"), alpha3 = Alpha3Code("BMU"), numeric = NumericCode("060"), + name = CountryName("Bermuda"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDF2"), + native = "Bermuda", + continent = Continent.NORTH_AMERICA, region = Region.NORTHERN_AMERICA, + callingCode = CallingCode("+1"), currency = CurrencyCode("BMD"), timezone = TimezoneId("Atlantic/Bermuda") ), Country( - alpha2 = Alpha2Code("CZ"), - alpha3 = Alpha3Code("CZE"), - numeric = NumericCode("203"), - name = CountryName("Czechia"), - flag = FlagEmoji("🇨🇿"), - native = "Česko" + alpha2 = Alpha2Code("BN"), alpha3 = Alpha3Code("BRN"), numeric = NumericCode("096"), + name = CountryName("Brunei Darussalam"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDF3"), + displayName = "Brunei", native = "Brunei", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+673"), currency = CurrencyCode("BND"), timezone = TimezoneId("Asia/Brunei") ), Country( - alpha2 = Alpha2Code("DE"), - alpha3 = Alpha3Code("DEU"), - numeric = NumericCode("276"), - name = CountryName("Germany"), - flag = FlagEmoji("🇩🇪"), - native = "Deutschland" + alpha2 = Alpha2Code("BO"), alpha3 = Alpha3Code("BOL"), numeric = NumericCode("068"), + name = CountryName("Bolivia (Plurinational State of)"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDF4"), + displayName = "Bolivia", native = "Bolivia", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+591"), currency = CurrencyCode("BOB"), timezone = TimezoneId("America/La_Paz") ), Country( - alpha2 = Alpha2Code("DJ"), - alpha3 = Alpha3Code("DJI"), - numeric = NumericCode("262"), - name = CountryName("Djibouti"), - flag = FlagEmoji("🇩🇯"), - native = "جيبوتي‎" + alpha2 = Alpha2Code("BQ"), alpha3 = Alpha3Code("BES"), numeric = NumericCode("535"), + name = CountryName("Bonaire, Sint Eustatius and Saba"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDF6"), + native = "Caribisch Nederland", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+599"), currency = CurrencyCode("USD"), timezone = TimezoneId("America/Kralendijk") ), Country( - alpha2 = Alpha2Code("DK"), - alpha3 = Alpha3Code("DNK"), - numeric = NumericCode("208"), - name = CountryName("Denmark"), - flag = FlagEmoji("🇩🇰"), - native = "Danmark" + alpha2 = Alpha2Code("BR"), alpha3 = Alpha3Code("BRA"), numeric = NumericCode("076"), + name = CountryName("Brazil"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDF7"), + native = "Brasil", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+55"), currency = CurrencyCode("BRL"), timezone = TimezoneId("America/Sao_Paulo") ), Country( - alpha2 = Alpha2Code("DM"), - alpha3 = Alpha3Code("DMA"), - numeric = NumericCode("212"), - name = CountryName("Dominica"), - flag = FlagEmoji("🇩🇲"), - native = "Dominica" + alpha2 = Alpha2Code("BS"), alpha3 = Alpha3Code("BHS"), numeric = NumericCode("044"), + name = CountryName("Bahamas (the)"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDF8"), + displayName = "Bahamas", native = "Bahamas", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("BSD"), timezone = TimezoneId("America/Nassau") ), Country( - alpha2 = Alpha2Code("DO"), - alpha3 = Alpha3Code("DOM"), - numeric = NumericCode("214"), - name = CountryName("Dominican Republic (the)"), - flag = FlagEmoji("🇩🇴"), - displayName = "Dominican Republic", - native = "República Dominicana" + alpha2 = Alpha2Code("BT"), alpha3 = Alpha3Code("BTN"), numeric = NumericCode("064"), + name = CountryName("Bhutan"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDF9"), + native = "\u0F60\u0F56\u0FB2\u0F74\u0F42\u0F0B\u0F61\u0F74\u0F63\u0F0B", + continent = Continent.ASIA, region = Region.SOUTHERN_ASIA, + callingCode = CallingCode("+975"), currency = CurrencyCode("BTN"), timezone = TimezoneId("Asia/Thimphu") ), Country( - alpha2 = Alpha2Code("DZ"), - alpha3 = Alpha3Code("DZA"), - numeric = NumericCode("012"), - name = CountryName("Algeria"), - flag = FlagEmoji("🇩🇿"), - native = "الجزائر" + alpha2 = Alpha2Code("BV"), alpha3 = Alpha3Code("BVT"), numeric = NumericCode("074"), + name = CountryName("Bouvet Island"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDFB"), + native = "Bouvet\u00F8ya", + continent = Continent.ANTARCTICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+47"), currency = CurrencyCode("NOK"), timezone = TimezoneId("UTC") ), Country( - alpha2 = Alpha2Code("EC"), - alpha3 = Alpha3Code("ECU"), - numeric = NumericCode("218"), - name = CountryName("Ecuador"), - flag = FlagEmoji("🇪🇨"), - native = "Ecuador" + alpha2 = Alpha2Code("BW"), alpha3 = Alpha3Code("BWA"), numeric = NumericCode("072"), + name = CountryName("Botswana"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDFC"), + native = "Botswana", + continent = Continent.AFRICA, region = Region.SOUTHERN_AFRICA, + callingCode = CallingCode("+267"), currency = CurrencyCode("BWP"), timezone = TimezoneId("Africa/Gaborone") ), Country( - alpha2 = Alpha2Code("EE"), - alpha3 = Alpha3Code("EST"), - numeric = NumericCode("233"), - name = CountryName("Estonia"), - flag = FlagEmoji("🇪🇪"), - native = "Eesti" + alpha2 = Alpha2Code("BY"), alpha3 = Alpha3Code("BLR"), numeric = NumericCode("112"), + name = CountryName("Belarus"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDFE"), + native = "\u0411\u0435\u043B\u0430\u0440\u0443\u0301\u0441\u044C", + continent = Continent.EUROPE, region = Region.EASTERN_EUROPE, + callingCode = CallingCode("+375"), currency = CurrencyCode("BYN"), timezone = TimezoneId("Europe/Minsk") ), Country( - alpha2 = Alpha2Code("EG"), - alpha3 = Alpha3Code("EGY"), - numeric = NumericCode("818"), - name = CountryName("Egypt"), - flag = FlagEmoji("🇪🇬"), - native = "مصر" - ), + alpha2 = Alpha2Code("BZ"), alpha3 = Alpha3Code("BLZ"), numeric = NumericCode("084"), + name = CountryName("Belize"), flag = FlagEmoji("\uD83C\uDDE7\uD83C\uDDFF"), + native = "Belize", + continent = Continent.NORTH_AMERICA, region = Region.CENTRAL_AMERICA, + callingCode = CallingCode("+501"), currency = CurrencyCode("BZD"), timezone = TimezoneId("America/Belize") + ), Country( - alpha2 = Alpha2Code("EH"), - alpha3 = Alpha3Code("ESH"), - numeric = NumericCode("732"), - name = CountryName("Western Sahara"), - flag = FlagEmoji("🇪🇭"), - native = "Western Sahara" - ), + alpha2 = Alpha2Code("CA"), alpha3 = Alpha3Code("CAN"), numeric = NumericCode("124"), + name = CountryName("Canada"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDE6"), + native = "Canada", + continent = Continent.NORTH_AMERICA, region = Region.NORTHERN_AMERICA, + callingCode = CallingCode("+1"), currency = CurrencyCode("CAD"), timezone = TimezoneId("America/Toronto") + ), Country( - alpha2 = Alpha2Code("ER"), - alpha3 = Alpha3Code("ERI"), - numeric = NumericCode("232"), - name = CountryName("Eritrea"), - flag = FlagEmoji("🇪🇷"), - native = "إرتريا‎" - ), + alpha2 = Alpha2Code("CC"), alpha3 = Alpha3Code("CCK"), numeric = NumericCode("166"), + name = CountryName("Cocos (Keeling) Islands (the)"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDE8"), + displayName = "Cocos (Keeling) Islands", native = "Cocos (Keeling) Islands", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+61"), currency = CurrencyCode("AUD"), timezone = TimezoneId("Indian/Cocos") + ), Country( - alpha2 = Alpha2Code("ES"), - alpha3 = Alpha3Code("ESP"), - numeric = NumericCode("724"), - name = CountryName("Spain"), - flag = FlagEmoji("🇪🇸"), - native = "España" - ), + alpha2 = Alpha2Code("CD"), alpha3 = Alpha3Code("COD"), numeric = NumericCode("180"), + name = CountryName("Congo (the Democratic Republic of the)"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDE9"), + displayName = "Democratic Republic of the Congo", native = "R\u00E9publique d\u00E9mocratique du Congo", + continent = Continent.AFRICA, region = Region.MIDDLE_AFRICA, + callingCode = CallingCode("+243"), currency = CurrencyCode("CDF"), timezone = TimezoneId("Africa/Kinshasa") + ), Country( - alpha2 = Alpha2Code("ET"), - alpha3 = Alpha3Code("ETH"), - numeric = NumericCode("231"), - name = CountryName("Ethiopia"), - flag = FlagEmoji("🇪🇹"), - native = "ኢትዮጵያ" - ), + alpha2 = Alpha2Code("CF"), alpha3 = Alpha3Code("CAF"), numeric = NumericCode("140"), + name = CountryName("Central African Republic (the)"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDEB"), + displayName = "Central African Republic", native = "R\u00E9publique centrafricaine", + continent = Continent.AFRICA, region = Region.MIDDLE_AFRICA, + callingCode = CallingCode("+236"), currency = CurrencyCode("XAF"), timezone = TimezoneId("Africa/Bangui") + ), Country( - alpha2 = Alpha2Code("FI"), - alpha3 = Alpha3Code("FIN"), - numeric = NumericCode("246"), - name = CountryName("Finland"), - flag = FlagEmoji("🇫🇮"), - native = "Suomi" - ), + alpha2 = Alpha2Code("CG"), alpha3 = Alpha3Code("COG"), numeric = NumericCode("178"), + name = CountryName("Congo (the)"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDEC"), + displayName = "Republic of the Congo", native = "R\u00E9publique du Congo", + continent = Continent.AFRICA, region = Region.MIDDLE_AFRICA, + callingCode = CallingCode("+242"), currency = CurrencyCode("XAF"), timezone = TimezoneId("Africa/Brazzaville") + ), Country( - alpha2 = Alpha2Code("FJ"), - alpha3 = Alpha3Code("FJI"), - numeric = NumericCode("242"), - name = CountryName("Fiji"), - flag = FlagEmoji("🇫🇯"), - native = "Fiji" - ), + alpha2 = Alpha2Code("CH"), alpha3 = Alpha3Code("CHE"), numeric = NumericCode("756"), + name = CountryName("Switzerland"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDED"), + native = "Suisse", + continent = Continent.EUROPE, region = Region.WESTERN_EUROPE, + callingCode = CallingCode("+41"), currency = CurrencyCode("CHF"), timezone = TimezoneId("Europe/Zurich") + ), Country( - alpha2 = Alpha2Code("FK"), - alpha3 = Alpha3Code("FLK"), - numeric = NumericCode("238"), - name = CountryName("Falkland Islands (the) [Malvinas]"), - flag = FlagEmoji("🇫🇰"), - displayName = "Falkland Islands (Malvinas)", - native = "Falkland Islands" + alpha2 = Alpha2Code("CI"), alpha3 = Alpha3Code("CIV"), numeric = NumericCode("384"), + name = CountryName("C\u00F4te d\u2019Ivoire"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDEE"), + native = "C\u00F4te d\u2019Ivoire", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+225"), currency = CurrencyCode("XOF"), timezone = TimezoneId("Africa/Abidjan") ), Country( - alpha2 = Alpha2Code("FM"), - alpha3 = Alpha3Code("FSM"), - numeric = NumericCode("583"), - name = CountryName("Micronesia (Federated States of)"), - flag = FlagEmoji("🇫🇲"), - displayName = "Micronesia", - native = "Micronesia" + alpha2 = Alpha2Code("CK"), alpha3 = Alpha3Code("COK"), numeric = NumericCode("184"), + name = CountryName("Cook Islands (the)"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDF0"), + displayName = "Cook Islands", native = "Cook Islands", + continent = Continent.OCEANIA, region = Region.POLYNESIA, + callingCode = CallingCode("+682"), currency = CurrencyCode("NZD"), timezone = TimezoneId("Pacific/Rarotonga") ), Country( - alpha2 = Alpha2Code("FO"), - alpha3 = Alpha3Code("FRO"), - numeric = NumericCode("234"), - name = CountryName("Faroe Islands (the)"), - flag = FlagEmoji("🇫🇴"), - displayName = "Faroe Islands", - native = "Føroyar" + alpha2 = Alpha2Code("CL"), alpha3 = Alpha3Code("CHL"), numeric = NumericCode("152"), + name = CountryName("Chile"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDF1"), + native = "Chile", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+56"), currency = CurrencyCode("CLP"), timezone = TimezoneId("America/Santiago") ), Country( - alpha2 = Alpha2Code("FR"), - alpha3 = Alpha3Code("FRA"), - numeric = NumericCode("250"), - name = CountryName("France"), - flag = FlagEmoji("🇫🇷"), - native = "France" + alpha2 = Alpha2Code("CM"), alpha3 = Alpha3Code("CMR"), numeric = NumericCode("120"), + name = CountryName("Cameroon"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDF2"), + native = "Cameroon", + continent = Continent.AFRICA, region = Region.MIDDLE_AFRICA, + callingCode = CallingCode("+237"), currency = CurrencyCode("XAF"), timezone = TimezoneId("Africa/Douala") ), Country( - alpha2 = Alpha2Code("GA"), - alpha3 = Alpha3Code("GAB"), - numeric = NumericCode("266"), - name = CountryName("Gabon"), - flag = FlagEmoji("🇬🇦"), - native = "Gabon" + alpha2 = Alpha2Code("CN"), alpha3 = Alpha3Code("CHN"), numeric = NumericCode("156"), + name = CountryName("China"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDF3"), + native = "\u4E2D\u56FD", + continent = Continent.ASIA, region = Region.EASTERN_ASIA, + callingCode = CallingCode("+86"), currency = CurrencyCode("CNY"), timezone = TimezoneId("Asia/Shanghai") ), Country( - alpha2 = Alpha2Code("GB"), - alpha3 = Alpha3Code("GBR"), - numeric = NumericCode("826"), - name = CountryName("United Kingdom of Great Britain and Northern Ireland (the)"), - flag = FlagEmoji("🇬🇧"), - displayName = "United Kingdom", - native = "United Kingdom" + alpha2 = Alpha2Code("CO"), alpha3 = Alpha3Code("COL"), numeric = NumericCode("170"), + name = CountryName("Colombia"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDF4"), + native = "Colombia", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+57"), currency = CurrencyCode("COP"), timezone = TimezoneId("America/Bogota") ), - Country( - alpha2 = Alpha2Code("GD"), - alpha3 = Alpha3Code("GRD"), - numeric = NumericCode("308"), - name = CountryName("Grenada"), - flag = FlagEmoji("🇬🇩"), - native = "Grenada" + Country( + alpha2 = Alpha2Code("CR"), alpha3 = Alpha3Code("CRI"), numeric = NumericCode("188"), + name = CountryName("Costa Rica"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDF7"), + native = "Costa Rica", + continent = Continent.NORTH_AMERICA, region = Region.CENTRAL_AMERICA, + callingCode = CallingCode("+506"), currency = CurrencyCode("CRC"), timezone = TimezoneId("America/Costa_Rica") ), - Country( - alpha2 = Alpha2Code("GE"), - alpha3 = Alpha3Code("GEO"), - numeric = NumericCode("268"), - name = CountryName("Georgia"), - flag = FlagEmoji("🇬🇪"), - native = "საქართველო" + Country( + alpha2 = Alpha2Code("CU"), alpha3 = Alpha3Code("CUB"), numeric = NumericCode("192"), + name = CountryName("Cuba"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDFA"), + native = "Cuba", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+53"), currency = CurrencyCode("CUP"), timezone = TimezoneId("America/Havana") ), - Country( - alpha2 = Alpha2Code("GF"), - alpha3 = Alpha3Code("GUF"), - numeric = NumericCode("254"), - name = CountryName("French Guiana"), - flag = FlagEmoji("🇬🇫"), - native = "Guyane française" + Country( + alpha2 = Alpha2Code("CV"), alpha3 = Alpha3Code("CPV"), numeric = NumericCode("132"), + name = CountryName("Cabo Verde"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDFB"), + native = "Cabo Verde", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+238"), currency = CurrencyCode("CVE"), timezone = TimezoneId("Atlantic/Cape_Verde") ), - Country( - alpha2 = Alpha2Code("GG"), - alpha3 = Alpha3Code("GGY"), - numeric = NumericCode("831"), - name = CountryName("Guernsey"), - flag = FlagEmoji("🇬🇬"), - native = "Guernsey" + Country( + alpha2 = Alpha2Code("CW"), alpha3 = Alpha3Code("CUW"), numeric = NumericCode("531"), + name = CountryName("Cura\u00E7ao"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDFC"), + native = "Cura\u00E7ao", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+599"), currency = CurrencyCode("ANG"), timezone = TimezoneId("America/Curacao") ), - Country( - alpha2 = Alpha2Code("GH"), - alpha3 = Alpha3Code("GHA"), - numeric = NumericCode("288"), - name = CountryName("Ghana"), - flag = FlagEmoji("🇬🇭"), - native = "Ghana" + Country( + alpha2 = Alpha2Code("CX"), alpha3 = Alpha3Code("CXR"), numeric = NumericCode("162"), + name = CountryName("Christmas Island"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDFD"), + native = "Christmas Island", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+61"), currency = CurrencyCode("AUD"), timezone = TimezoneId("Indian/Christmas") ), - Country( - alpha2 = Alpha2Code("GI"), - alpha3 = Alpha3Code("GIB"), - numeric = NumericCode("292"), - name = CountryName("Gibraltar"), - flag = FlagEmoji("🇬🇮"), - native = "Gibraltar" + Country( + alpha2 = Alpha2Code("CY"), alpha3 = Alpha3Code("CYP"), numeric = NumericCode("196"), + name = CountryName("Cyprus"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDFE"), + native = "\u039A\u03CD\u03C0\u03C1\u03BF\u03C2", + continent = Continent.EUROPE, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+357"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Asia/Nicosia") ), - Country( - alpha2 = Alpha2Code("GL"), - alpha3 = Alpha3Code("GRL"), - numeric = NumericCode("304"), - name = CountryName("Greenland"), - flag = FlagEmoji("🇬🇱"), - native = "Kalaallit Nunaat" + Country( + alpha2 = Alpha2Code("CZ"), alpha3 = Alpha3Code("CZE"), numeric = NumericCode("203"), + name = CountryName("Czechia"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDFF"), + native = "\u010Cesko", + continent = Continent.EUROPE, region = Region.EASTERN_EUROPE, + callingCode = CallingCode("+420"), currency = CurrencyCode("CZK"), timezone = TimezoneId("Europe/Prague") ), Country( - alpha2 = Alpha2Code("GM"), - alpha3 = Alpha3Code("GMB"), - numeric = NumericCode("270"), - name = CountryName("Gambia (the)"), - flag = FlagEmoji("🇬🇲"), - displayName = "Gambia", - native = "Gambia" + alpha2 = Alpha2Code("DE"), alpha3 = Alpha3Code("DEU"), numeric = NumericCode("276"), + name = CountryName("Germany"), flag = FlagEmoji("\uD83C\uDDE9\uD83C\uDDEA"), + native = "Deutschland", + continent = Continent.EUROPE, region = Region.WESTERN_EUROPE, + callingCode = CallingCode("+49"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Berlin") ), Country( - alpha2 = Alpha2Code("GN"), - alpha3 = Alpha3Code("GIN"), - numeric = NumericCode("324"), - name = CountryName("Guinea"), - flag = FlagEmoji("🇬🇳"), - native = "Guinée" + alpha2 = Alpha2Code("DJ"), alpha3 = Alpha3Code("DJI"), numeric = NumericCode("262"), + name = CountryName("Djibouti"), flag = FlagEmoji("\uD83C\uDDE9\uD83C\uDDEF"), + native = "\u062C\u064A\u0628\u0648\u062A\u064A\u200E", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+253"), currency = CurrencyCode("DJF"), timezone = TimezoneId("Africa/Djibouti") ), Country( - alpha2 = Alpha2Code("GP"), - alpha3 = Alpha3Code("GLP"), - numeric = NumericCode("312"), - name = CountryName("Guadeloupe"), - flag = FlagEmoji("🇬🇵"), - native = "Guadeloupe" + alpha2 = Alpha2Code("DK"), alpha3 = Alpha3Code("DNK"), numeric = NumericCode("208"), + name = CountryName("Denmark"), flag = FlagEmoji("\uD83C\uDDE9\uD83C\uDDF0"), + native = "Danmark", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+45"), currency = CurrencyCode("DKK"), timezone = TimezoneId("Europe/Copenhagen") ), Country( - alpha2 = Alpha2Code("GQ"), - alpha3 = Alpha3Code("GNQ"), - numeric = NumericCode("226"), - name = CountryName("Equatorial Guinea"), - flag = FlagEmoji("🇬🇶"), - native = "Guinée équatoriale" + alpha2 = Alpha2Code("DM"), alpha3 = Alpha3Code("DMA"), numeric = NumericCode("212"), + name = CountryName("Dominica"), flag = FlagEmoji("\uD83C\uDDE9\uD83C\uDDF2"), + native = "Dominica", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("XCD"), timezone = TimezoneId("America/Dominica") ), Country( - alpha2 = Alpha2Code("GR"), - alpha3 = Alpha3Code("GRC"), - numeric = NumericCode("300"), - name = CountryName("Greece"), - flag = FlagEmoji("🇬🇷"), - native = "Ελλάδα" + alpha2 = Alpha2Code("DO"), alpha3 = Alpha3Code("DOM"), numeric = NumericCode("214"), + name = CountryName("Dominican Republic (the)"), flag = FlagEmoji("\uD83C\uDDE9\uD83C\uDDF4"), + displayName = "Dominican Republic", native = "Rep\u00FAblica Dominicana", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("DOP"), timezone = TimezoneId("America/Santo_Domingo") ), Country( - alpha2 = Alpha2Code("GS"), - alpha3 = Alpha3Code("SGS"), - numeric = NumericCode("239"), - name = CountryName("South Georgia and the South Sandwich Islands"), - flag = FlagEmoji("🇬🇸"), - native = "South Georgia" + alpha2 = Alpha2Code("DZ"), alpha3 = Alpha3Code("DZA"), numeric = NumericCode("012"), + name = CountryName("Algeria"), flag = FlagEmoji("\uD83C\uDDE9\uD83C\uDDFF"), + native = "\u0627\u0644\u062C\u0632\u0627\u0626\u0631", + continent = Continent.AFRICA, region = Region.NORTHERN_AFRICA, + callingCode = CallingCode("+213"), currency = CurrencyCode("DZD"), timezone = TimezoneId("Africa/Algiers") ), Country( - alpha2 = Alpha2Code("GT"), - alpha3 = Alpha3Code("GTM"), - numeric = NumericCode("320"), - name = CountryName("Guatemala"), - flag = FlagEmoji("🇬🇹"), - native = "Guatemala" + alpha2 = Alpha2Code("EC"), alpha3 = Alpha3Code("ECU"), numeric = NumericCode("218"), + name = CountryName("Ecuador"), flag = FlagEmoji("\uD83C\uDDEA\uD83C\uDDE8"), + native = "Ecuador", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+593"), currency = CurrencyCode("USD"), timezone = TimezoneId("America/Guayaquil") ), Country( - alpha2 = Alpha2Code("GU"), - alpha3 = Alpha3Code("GUM"), - numeric = NumericCode("316"), - name = CountryName("Guam"), - flag = FlagEmoji("🇬🇺"), - native = "Guåhån" + alpha2 = Alpha2Code("EE"), alpha3 = Alpha3Code("EST"), numeric = NumericCode("233"), + name = CountryName("Estonia"), flag = FlagEmoji("\uD83C\uDDEA\uD83C\uDDEA"), + native = "Eesti", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+372"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Tallinn") ), Country( - alpha2 = Alpha2Code("GW"), - alpha3 = Alpha3Code("GNB"), - numeric = NumericCode("624"), - name = CountryName("Guinea-Bissau"), - flag = FlagEmoji("🇬🇼"), - native = "Guiné-Bissau" + alpha2 = Alpha2Code("EG"), alpha3 = Alpha3Code("EGY"), numeric = NumericCode("818"), + name = CountryName("Egypt"), flag = FlagEmoji("\uD83C\uDDEA\uD83C\uDDEC"), + native = "\u0645\u0635\u0631", + continent = Continent.AFRICA, region = Region.NORTHERN_AFRICA, + callingCode = CallingCode("+20"), currency = CurrencyCode("EGP"), timezone = TimezoneId("Africa/Cairo") ), Country( - alpha2 = Alpha2Code("GY"), - alpha3 = Alpha3Code("GUY"), - numeric = NumericCode("328"), - name = CountryName("Guyana"), - flag = FlagEmoji("🇬🇾"), - native = "Guyana" + alpha2 = Alpha2Code("EH"), alpha3 = Alpha3Code("ESH"), numeric = NumericCode("732"), + name = CountryName("Western Sahara"), flag = FlagEmoji("\uD83C\uDDEA\uD83C\uDDED"), + native = "Western Sahara", + continent = Continent.AFRICA, region = Region.NORTHERN_AFRICA, + callingCode = CallingCode("+212"), currency = CurrencyCode("MAD"), timezone = TimezoneId("Africa/El_Aaiun") ), Country( - alpha2 = Alpha2Code("HK"), - alpha3 = Alpha3Code("HKG"), - numeric = NumericCode("344"), - name = CountryName("Hong Kong"), - flag = FlagEmoji("🇭🇰"), - native = "Hong Kong" + alpha2 = Alpha2Code("ER"), alpha3 = Alpha3Code("ERI"), numeric = NumericCode("232"), + name = CountryName("Eritrea"), flag = FlagEmoji("\uD83C\uDDEA\uD83C\uDDF7"), + native = "\u0625\u0631\u062A\u0631\u064A\u0627\u200E", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+291"), currency = CurrencyCode("ERN"), timezone = TimezoneId("Africa/Asmara") ), Country( - alpha2 = Alpha2Code("HM"), - alpha3 = Alpha3Code("HMD"), - numeric = NumericCode("334"), - name = CountryName("Heard Island and McDonald Islands"), - flag = FlagEmoji("🇭🇲"), - native = "Heard Island and McDonald Islands" + alpha2 = Alpha2Code("ES"), alpha3 = Alpha3Code("ESP"), numeric = NumericCode("724"), + name = CountryName("Spain"), flag = FlagEmoji("\uD83C\uDDEA\uD83C\uDDF8"), + native = "Espa\u00F1a", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+34"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Madrid") ), Country( - alpha2 = Alpha2Code("HN"), - alpha3 = Alpha3Code("HND"), - numeric = NumericCode("340"), - name = CountryName("Honduras"), - flag = FlagEmoji("🇭🇳"), - native = "Honduras" + alpha2 = Alpha2Code("ET"), alpha3 = Alpha3Code("ETH"), numeric = NumericCode("231"), + name = CountryName("Ethiopia"), flag = FlagEmoji("\uD83C\uDDEA\uD83C\uDDF9"), + native = "\u12A2\u1275\u12EE\u1335\u12EB", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+251"), currency = CurrencyCode("ETB"), timezone = TimezoneId("Africa/Addis_Ababa") ), Country( - alpha2 = Alpha2Code("HR"), - alpha3 = Alpha3Code("HRV"), - numeric = NumericCode("191"), - name = CountryName("Croatia"), - flag = FlagEmoji("🇭🇷"), - native = "Hrvatska" + alpha2 = Alpha2Code("FI"), alpha3 = Alpha3Code("FIN"), numeric = NumericCode("246"), + name = CountryName("Finland"), flag = FlagEmoji("\uD83C\uDDEB\uD83C\uDDEE"), + native = "Suomi", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+358"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Helsinki") ), Country( - alpha2 = Alpha2Code("HT"), - alpha3 = Alpha3Code("HTI"), - numeric = NumericCode("332"), - name = CountryName("Haiti"), - flag = FlagEmoji("🇭🇹"), - native = "Haïti" + alpha2 = Alpha2Code("FJ"), alpha3 = Alpha3Code("FJI"), numeric = NumericCode("242"), + name = CountryName("Fiji"), flag = FlagEmoji("\uD83C\uDDEB\uD83C\uDDEF"), + native = "Fiji", + continent = Continent.OCEANIA, region = Region.MELANESIA, + callingCode = CallingCode("+679"), currency = CurrencyCode("FJD"), timezone = TimezoneId("Pacific/Fiji") ), Country( - alpha2 = Alpha2Code("HU"), - alpha3 = Alpha3Code("HUN"), - numeric = NumericCode("348"), - name = CountryName("Hungary"), - flag = FlagEmoji("🇭🇺"), - native = "Magyarország" + alpha2 = Alpha2Code("FK"), alpha3 = Alpha3Code("FLK"), numeric = NumericCode("238"), + name = CountryName("Falkland Islands (the) [Malvinas]"), flag = FlagEmoji("\uD83C\uDDEB\uD83C\uDDF0"), + displayName = "Falkland Islands (Malvinas)", native = "Falkland Islands", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+500"), currency = CurrencyCode("FKP"), timezone = TimezoneId("Atlantic/Stanley") ), Country( - alpha2 = Alpha2Code("ID"), - alpha3 = Alpha3Code("IDN"), - numeric = NumericCode("360"), - name = CountryName("Indonesia"), - flag = FlagEmoji("🇮🇩"), - native = "Indonesia" + alpha2 = Alpha2Code("FM"), alpha3 = Alpha3Code("FSM"), numeric = NumericCode("583"), + name = CountryName("Micronesia (Federated States of)"), flag = FlagEmoji("\uD83C\uDDEB\uD83C\uDDF2"), + displayName = "Micronesia", native = "Micronesia", + continent = Continent.OCEANIA, region = Region.MICRONESIA, + callingCode = CallingCode("+691"), currency = CurrencyCode("USD"), timezone = TimezoneId("Pacific/Pohnpei") ), Country( - alpha2 = Alpha2Code("IE"), - alpha3 = Alpha3Code("IRL"), - numeric = NumericCode("372"), - name = CountryName("Ireland"), - flag = FlagEmoji("🇮🇪"), - native = "Ireland" + alpha2 = Alpha2Code("FO"), alpha3 = Alpha3Code("FRO"), numeric = NumericCode("234"), + name = CountryName("Faroe Islands (the)"), flag = FlagEmoji("\uD83C\uDDEB\uD83C\uDDF4"), + displayName = "Faroe Islands", native = "F\u00F8royar", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+298"), currency = CurrencyCode("DKK"), timezone = TimezoneId("Atlantic/Faroe") ), Country( - alpha2 = Alpha2Code("IL"), - alpha3 = Alpha3Code("ISR"), - numeric = NumericCode("376"), - name = CountryName("Israel"), - flag = FlagEmoji("🇮🇱"), - native = "إسرائيل" + alpha2 = Alpha2Code("FR"), alpha3 = Alpha3Code("FRA"), numeric = NumericCode("250"), + name = CountryName("France"), flag = FlagEmoji("\uD83C\uDDEB\uD83C\uDDF7"), + native = "France", + continent = Continent.EUROPE, region = Region.WESTERN_EUROPE, + callingCode = CallingCode("+33"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Paris") ), Country( - alpha2 = Alpha2Code("IM"), - alpha3 = Alpha3Code("IMN"), - numeric = NumericCode("833"), - name = CountryName("Isle of Man"), - flag = FlagEmoji("🇮🇲"), - native = "Isle of Man" + alpha2 = Alpha2Code("GA"), alpha3 = Alpha3Code("GAB"), numeric = NumericCode("266"), + name = CountryName("Gabon"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDE6"), + native = "Gabon", + continent = Continent.AFRICA, region = Region.MIDDLE_AFRICA, + callingCode = CallingCode("+241"), currency = CurrencyCode("XAF"), timezone = TimezoneId("Africa/Libreville") ), Country( - alpha2 = Alpha2Code("IN"), - alpha3 = Alpha3Code("IND"), - numeric = NumericCode("356"), - name = CountryName("India"), - flag = FlagEmoji("🇮🇳"), - native = "India" + alpha2 = Alpha2Code("GB"), alpha3 = Alpha3Code("GBR"), numeric = NumericCode("826"), + name = CountryName("United Kingdom of Great Britain and Northern Ireland (the)"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDE7"), + displayName = "United Kingdom", native = "United Kingdom", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+44"), currency = CurrencyCode("GBP"), timezone = TimezoneId("Europe/London") ), Country( - alpha2 = Alpha2Code("IO"), - alpha3 = Alpha3Code("IOT"), - numeric = NumericCode("086"), - name = CountryName("British Indian Ocean Territory (the)"), - flag = FlagEmoji("🇮🇴"), - displayName = "British Indian Ocean Territory", - native = "British Indian Ocean Territory" + alpha2 = Alpha2Code("GD"), alpha3 = Alpha3Code("GRD"), numeric = NumericCode("308"), + name = CountryName("Grenada"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDE9"), + native = "Grenada", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("XCD"), timezone = TimezoneId("America/Grenada") ), Country( - alpha2 = Alpha2Code("IQ"), - alpha3 = Alpha3Code("IRQ"), - numeric = NumericCode("368"), - name = CountryName("Iraq"), - flag = FlagEmoji("🇮🇶"), - native = "العراق" + alpha2 = Alpha2Code("GE"), alpha3 = Alpha3Code("GEO"), numeric = NumericCode("268"), + name = CountryName("Georgia"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDEA"), + native = "\u10E1\u10D0\u10E5\u10D0\u10E0\u10D7\u10D5\u10D4\u10DA\u10DD", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+995"), currency = CurrencyCode("GEL"), timezone = TimezoneId("Asia/Tbilisi") ), Country( - alpha2 = Alpha2Code("IR"), - alpha3 = Alpha3Code("IRN"), - numeric = NumericCode("364"), - name = CountryName("Iran (Islamic Republic of)"), - flag = FlagEmoji("🇮🇷"), - displayName = "Iran", - native = "ایران" + alpha2 = Alpha2Code("GF"), alpha3 = Alpha3Code("GUF"), numeric = NumericCode("254"), + name = CountryName("French Guiana"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDEB"), + native = "Guyane fran\u00E7aise", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+594"), currency = CurrencyCode("EUR"), timezone = TimezoneId("America/Cayenne") ), Country( - alpha2 = Alpha2Code("IS"), - alpha3 = Alpha3Code("ISL"), - numeric = NumericCode("352"), - name = CountryName("Iceland"), - flag = FlagEmoji("🇮🇸"), - native = "Ísland" + alpha2 = Alpha2Code("GG"), alpha3 = Alpha3Code("GGY"), numeric = NumericCode("831"), + name = CountryName("Guernsey"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDEC"), + native = "Guernsey", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+44"), currency = CurrencyCode("GBP"), timezone = TimezoneId("Europe/Guernsey") ), Country( - alpha2 = Alpha2Code("IT"), - alpha3 = Alpha3Code("ITA"), - numeric = NumericCode("380"), - name = CountryName("Italy"), - flag = FlagEmoji("🇮🇹"), - native = "Italia" + alpha2 = Alpha2Code("GH"), alpha3 = Alpha3Code("GHA"), numeric = NumericCode("288"), + name = CountryName("Ghana"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDED"), + native = "Ghana", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+233"), currency = CurrencyCode("GHS"), timezone = TimezoneId("Africa/Accra") ), Country( - alpha2 = Alpha2Code("JE"), - alpha3 = Alpha3Code("JEY"), - numeric = NumericCode("832"), - name = CountryName("Jersey"), - flag = FlagEmoji("🇯🇪"), - native = "Jersey" + alpha2 = Alpha2Code("GI"), alpha3 = Alpha3Code("GIB"), numeric = NumericCode("292"), + name = CountryName("Gibraltar"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDEE"), + native = "Gibraltar", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+350"), currency = CurrencyCode("GIP"), timezone = TimezoneId("Europe/Gibraltar") ), Country( - alpha2 = Alpha2Code("JM"), - alpha3 = Alpha3Code("JAM"), - numeric = NumericCode("388"), - name = CountryName("Jamaica"), - flag = FlagEmoji("🇯🇲"), - native = "Jamaica" - ), + alpha2 = Alpha2Code("GL"), alpha3 = Alpha3Code("GRL"), numeric = NumericCode("304"), + name = CountryName("Greenland"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDF1"), + native = "Kalaallit Nunaat", + continent = Continent.NORTH_AMERICA, region = Region.NORTHERN_AMERICA, + callingCode = CallingCode("+299"), currency = CurrencyCode("DKK"), timezone = TimezoneId("America/Nuuk") + ), Country( - alpha2 = Alpha2Code("JO"), - alpha3 = Alpha3Code("JOR"), - numeric = NumericCode("400"), - name = CountryName("Jordan"), - flag = FlagEmoji("🇯🇴"), - native = "الأردن" - ), + alpha2 = Alpha2Code("GM"), alpha3 = Alpha3Code("GMB"), numeric = NumericCode("270"), + name = CountryName("Gambia (the)"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDF2"), + displayName = "Gambia", native = "Gambia", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+220"), currency = CurrencyCode("GMD"), timezone = TimezoneId("Africa/Banjul") + ), Country( - alpha2 = Alpha2Code("JP"), - alpha3 = Alpha3Code("JPN"), - numeric = NumericCode("392"), - name = CountryName("Japan"), - flag = FlagEmoji("🇯🇵"), - native = "日本" - ), - Country( - alpha2 = Alpha2Code("KE"), - alpha3 = Alpha3Code("KEN"), - numeric = NumericCode("404"), - name = CountryName("Kenya"), - flag = FlagEmoji("🇰🇪"), - native = "Kenya" - ), - Country( - alpha2 = Alpha2Code("KG"), - alpha3 = Alpha3Code("KGZ"), - numeric = NumericCode("417"), - name = CountryName("Kyrgyzstan"), - flag = FlagEmoji("🇰🇬"), - native = "Кыргызстан" - ), - Country( - alpha2 = Alpha2Code("KH"), - alpha3 = Alpha3Code("KHM"), - numeric = NumericCode("116"), - name = CountryName("Cambodia"), - flag = FlagEmoji("🇰🇭"), - native = "Kâmpŭchéa" - ), - Country( - alpha2 = Alpha2Code("KI"), - alpha3 = Alpha3Code("KIR"), - numeric = NumericCode("296"), - name = CountryName("Kiribati"), - flag = FlagEmoji("🇰🇮"), - native = "Kiribati" - ), - Country( - alpha2 = Alpha2Code("KM"), - alpha3 = Alpha3Code("COM"), - numeric = NumericCode("174"), - name = CountryName("Comoros (the)"), - flag = FlagEmoji("🇰🇲"), - displayName = "Comoros", - native = "Komori" - ), + alpha2 = Alpha2Code("GN"), alpha3 = Alpha3Code("GIN"), numeric = NumericCode("324"), + name = CountryName("Guinea"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDF3"), + native = "Guin\u00E9e", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+224"), currency = CurrencyCode("GNF"), timezone = TimezoneId("Africa/Conakry") + ), Country( - alpha2 = Alpha2Code("KN"), - alpha3 = Alpha3Code("KNA"), - numeric = NumericCode("659"), - name = CountryName("Saint Kitts and Nevis"), - flag = FlagEmoji("🇰🇳"), - native = "Saint Kitts and Nevis" - ), + alpha2 = Alpha2Code("GP"), alpha3 = Alpha3Code("GLP"), numeric = NumericCode("312"), + name = CountryName("Guadeloupe"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDF5"), + native = "Guadeloupe", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+590"), currency = CurrencyCode("EUR"), timezone = TimezoneId("America/Guadeloupe") + ), Country( - alpha2 = Alpha2Code("KP"), - alpha3 = Alpha3Code("PRK"), - numeric = NumericCode("408"), - name = CountryName("Korea (the Democratic People's Republic of)"), - flag = FlagEmoji("🇰🇵"), - displayName = "North Korea", - native = "조선민주주의인민공화국" + alpha2 = Alpha2Code("GQ"), alpha3 = Alpha3Code("GNQ"), numeric = NumericCode("226"), + name = CountryName("Equatorial Guinea"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDF6"), + native = "Guin\u00E9e \u00E9quatoriale", + continent = Continent.AFRICA, region = Region.MIDDLE_AFRICA, + callingCode = CallingCode("+240"), currency = CurrencyCode("XAF"), timezone = TimezoneId("Africa/Malabo") ), Country( - alpha2 = Alpha2Code("KR"), - alpha3 = Alpha3Code("KOR"), - numeric = NumericCode("410"), - name = CountryName("Korea (the Republic of)"), - flag = FlagEmoji("🇰🇷"), - displayName = "South Korea", - native = "대한민국" + alpha2 = Alpha2Code("GR"), alpha3 = Alpha3Code("GRC"), numeric = NumericCode("300"), + name = CountryName("Greece"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDF7"), + native = "\u0395\u03BB\u03BB\u03AC\u03B4\u03B1", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+30"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Athens") ), Country( - alpha2 = Alpha2Code("KW"), - alpha3 = Alpha3Code("KWT"), - numeric = NumericCode("414"), - name = CountryName("Kuwait"), - flag = FlagEmoji("🇰🇼"), - native = "الكويت" + alpha2 = Alpha2Code("GS"), alpha3 = Alpha3Code("SGS"), numeric = NumericCode("239"), + name = CountryName("South Georgia and the South Sandwich Islands"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDF8"), + native = "South Georgia", + continent = Continent.ANTARCTICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+500"), currency = CurrencyCode("GBP"), timezone = TimezoneId("Atlantic/South_Georgia") ), Country( - alpha2 = Alpha2Code("KY"), - alpha3 = Alpha3Code("CYM"), - numeric = NumericCode("136"), - name = CountryName("Cayman Islands (the)"), - flag = FlagEmoji("🇰🇾"), - displayName = "Cayman Islands", - native = "Cayman Islands" + alpha2 = Alpha2Code("GT"), alpha3 = Alpha3Code("GTM"), numeric = NumericCode("320"), + name = CountryName("Guatemala"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDF9"), + native = "Guatemala", + continent = Continent.NORTH_AMERICA, region = Region.CENTRAL_AMERICA, + callingCode = CallingCode("+502"), currency = CurrencyCode("GTQ"), timezone = TimezoneId("America/Guatemala") ), - Country( - alpha2 = Alpha2Code("KZ"), - alpha3 = Alpha3Code("KAZ"), - numeric = NumericCode("398"), - name = CountryName("Kazakhstan"), - flag = FlagEmoji("🇰🇿"), - native = "Қазақстан" + Country( + alpha2 = Alpha2Code("GU"), alpha3 = Alpha3Code("GUM"), numeric = NumericCode("316"), + name = CountryName("Guam"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDFA"), + native = "Gu\u00E5h\u00E5n", + continent = Continent.OCEANIA, region = Region.MICRONESIA, + callingCode = CallingCode("+1"), currency = CurrencyCode("USD"), timezone = TimezoneId("Pacific/Guam") ), - Country( - alpha2 = Alpha2Code("LA"), - alpha3 = Alpha3Code("LAO"), - numeric = NumericCode("418"), - name = CountryName("Lao People's Democratic Republic (the)"), - flag = FlagEmoji("🇱🇦"), - displayName = "Laos", - native = "ລາວ" - ), - Country( - alpha2 = Alpha2Code("LB"), - alpha3 = Alpha3Code("LBN"), - numeric = NumericCode("422"), - name = CountryName("Lebanon"), - flag = FlagEmoji("🇱🇧"), - native = "لبنان" - ), - Country( - alpha2 = Alpha2Code("LC"), - alpha3 = Alpha3Code("LCA"), - numeric = NumericCode("662"), - name = CountryName("Saint Lucia"), - flag = FlagEmoji("🇱🇨"), - native = "Saint Lucia" - ), - Country( - alpha2 = Alpha2Code("LI"), - alpha3 = Alpha3Code("LIE"), - numeric = NumericCode("438"), - name = CountryName("Liechtenstein"), - flag = FlagEmoji("🇱🇮"), - native = "Liechtenstein" - ), - Country( - alpha2 = Alpha2Code("LK"), - alpha3 = Alpha3Code("LKA"), - numeric = NumericCode("144"), - name = CountryName("Sri Lanka"), - flag = FlagEmoji("🇱🇰"), - native = "ශ්‍රී ලංකාව" - ), - Country( - alpha2 = Alpha2Code("LR"), - alpha3 = Alpha3Code("LBR"), - numeric = NumericCode("430"), - name = CountryName("Liberia"), - flag = FlagEmoji("🇱🇷"), - native = "Liberia" + Country( + alpha2 = Alpha2Code("GW"), alpha3 = Alpha3Code("GNB"), numeric = NumericCode("624"), + name = CountryName("Guinea-Bissau"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDFC"), + native = "Guin\u00E9-Bissau", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+245"), currency = CurrencyCode("XOF"), timezone = TimezoneId("Africa/Bissau") ), - Country( - alpha2 = Alpha2Code("LS"), - alpha3 = Alpha3Code("LSO"), - numeric = NumericCode("426"), - name = CountryName("Lesotho"), - flag = FlagEmoji("🇱🇸"), - native = "Lesotho" + Country( + alpha2 = Alpha2Code("GY"), alpha3 = Alpha3Code("GUY"), numeric = NumericCode("328"), + name = CountryName("Guyana"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDFE"), + native = "Guyana", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+592"), currency = CurrencyCode("GYD"), timezone = TimezoneId("America/Guyana") ), - Country( - alpha2 = Alpha2Code("LT"), - alpha3 = Alpha3Code("LTU"), - numeric = NumericCode("440"), - name = CountryName("Lithuania"), - flag = FlagEmoji("🇱🇹"), - native = "Lietuva" + Country( + alpha2 = Alpha2Code("HK"), alpha3 = Alpha3Code("HKG"), numeric = NumericCode("344"), + name = CountryName("Hong Kong"), flag = FlagEmoji("\uD83C\uDDED\uD83C\uDDF0"), + native = "Hong Kong", + continent = Continent.ASIA, region = Region.EASTERN_ASIA, + callingCode = CallingCode("+852"), currency = CurrencyCode("HKD"), timezone = TimezoneId("Asia/Hong_Kong") ), Country( - alpha2 = Alpha2Code("LU"), - alpha3 = Alpha3Code("LUX"), - numeric = NumericCode("442"), - name = CountryName("Luxembourg"), - flag = FlagEmoji("🇱🇺"), - native = "Luxemburg" + alpha2 = Alpha2Code("HM"), alpha3 = Alpha3Code("HMD"), numeric = NumericCode("334"), + name = CountryName("Heard Island and McDonald Islands"), flag = FlagEmoji("\uD83C\uDDED\uD83C\uDDF2"), + native = "Heard Island and McDonald Islands", + continent = Continent.ANTARCTICA, region = Region.AUSTRALIA_AND_NEW_ZEALAND, + callingCode = CallingCode("+672"), currency = CurrencyCode("AUD"), timezone = TimezoneId("Indian/Kerguelen") ), Country( - alpha2 = Alpha2Code("LV"), - alpha3 = Alpha3Code("LVA"), - numeric = NumericCode("428"), - name = CountryName("Latvia"), - flag = FlagEmoji("🇱🇻"), - native = "Latvija" + alpha2 = Alpha2Code("HN"), alpha3 = Alpha3Code("HND"), numeric = NumericCode("340"), + name = CountryName("Honduras"), flag = FlagEmoji("\uD83C\uDDED\uD83C\uDDF3"), + native = "Honduras", + continent = Continent.NORTH_AMERICA, region = Region.CENTRAL_AMERICA, + callingCode = CallingCode("+504"), currency = CurrencyCode("HNL"), timezone = TimezoneId("America/Tegucigalpa") ), Country( - alpha2 = Alpha2Code("LY"), - alpha3 = Alpha3Code("LBY"), - numeric = NumericCode("434"), - name = CountryName("Libya"), - flag = FlagEmoji("🇱🇾"), - native = "‏ليبيا" + alpha2 = Alpha2Code("HR"), alpha3 = Alpha3Code("HRV"), numeric = NumericCode("191"), + name = CountryName("Croatia"), flag = FlagEmoji("\uD83C\uDDED\uD83C\uDDF7"), + native = "Hrvatska", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+385"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Zagreb") ), Country( - alpha2 = Alpha2Code("MA"), - alpha3 = Alpha3Code("MAR"), - numeric = NumericCode("504"), - name = CountryName("Morocco"), - flag = FlagEmoji("🇲🇦"), - native = "المغرب" + alpha2 = Alpha2Code("HT"), alpha3 = Alpha3Code("HTI"), numeric = NumericCode("332"), + name = CountryName("Haiti"), flag = FlagEmoji("\uD83C\uDDED\uD83C\uDDF9"), + native = "Ha\u00EFti", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+509"), currency = CurrencyCode("HTG"), timezone = TimezoneId("America/Port-au-Prince") ), Country( - alpha2 = Alpha2Code("MC"), - alpha3 = Alpha3Code("MCO"), - numeric = NumericCode("492"), - name = CountryName("Monaco"), - flag = FlagEmoji("🇲🇨"), - native = "Monaco" + alpha2 = Alpha2Code("HU"), alpha3 = Alpha3Code("HUN"), numeric = NumericCode("348"), + name = CountryName("Hungary"), flag = FlagEmoji("\uD83C\uDDED\uD83C\uDDFA"), + native = "Magyarorsz\u00E1g", + continent = Continent.EUROPE, region = Region.EASTERN_EUROPE, + callingCode = CallingCode("+36"), currency = CurrencyCode("HUF"), timezone = TimezoneId("Europe/Budapest") ), Country( - alpha2 = Alpha2Code("MD"), - alpha3 = Alpha3Code("MDA"), - numeric = NumericCode("498"), - name = CountryName("Moldova (the Republic of)"), - flag = FlagEmoji("🇲🇩"), - displayName = "Moldova", - native = "Moldova" + alpha2 = Alpha2Code("ID"), alpha3 = Alpha3Code("IDN"), numeric = NumericCode("360"), + name = CountryName("Indonesia"), flag = FlagEmoji("\uD83C\uDDEE\uD83C\uDDE9"), + native = "Indonesia", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+62"), currency = CurrencyCode("IDR"), timezone = TimezoneId("Asia/Jakarta") ), Country( - alpha2 = Alpha2Code("ME"), - alpha3 = Alpha3Code("MNE"), - numeric = NumericCode("499"), - name = CountryName("Montenegro"), - flag = FlagEmoji("🇲🇪"), - native = "Црна Гора" + alpha2 = Alpha2Code("IE"), alpha3 = Alpha3Code("IRL"), numeric = NumericCode("372"), + name = CountryName("Ireland"), flag = FlagEmoji("\uD83C\uDDEE\uD83C\uDDEA"), + native = "Ireland", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+353"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Dublin") ), Country( - alpha2 = Alpha2Code("MF"), - alpha3 = Alpha3Code("MAF"), - numeric = NumericCode("663"), - name = CountryName("Saint Martin (French part)"), - flag = FlagEmoji("🇲🇫"), - native = "Saint-Martin" + alpha2 = Alpha2Code("IL"), alpha3 = Alpha3Code("ISR"), numeric = NumericCode("376"), + name = CountryName("Israel"), flag = FlagEmoji("\uD83C\uDDEE\uD83C\uDDF1"), + native = "\u0625\u0633\u0631\u0627\u0626\u064A\u0644", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+972"), currency = CurrencyCode("ILS"), timezone = TimezoneId("Asia/Jerusalem") ), Country( - alpha2 = Alpha2Code("MG"), - alpha3 = Alpha3Code("MDG"), - numeric = NumericCode("450"), - name = CountryName("Madagascar"), - flag = FlagEmoji("🇲🇬"), - native = "Madagascar" + alpha2 = Alpha2Code("IM"), alpha3 = Alpha3Code("IMN"), numeric = NumericCode("833"), + name = CountryName("Isle of Man"), flag = FlagEmoji("\uD83C\uDDEE\uD83C\uDDF2"), + native = "Isle of Man", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+44"), currency = CurrencyCode("GBP"), timezone = TimezoneId("Europe/Isle_of_Man") ), Country( - alpha2 = Alpha2Code("MH"), - alpha3 = Alpha3Code("MHL"), - numeric = NumericCode("584"), - name = CountryName("Marshall Islands (the)"), - flag = FlagEmoji("🇲🇭"), - displayName = "Marshall Islands", - native = "Marshall Islands" + alpha2 = Alpha2Code("IN"), alpha3 = Alpha3Code("IND"), numeric = NumericCode("356"), + name = CountryName("India"), flag = FlagEmoji("\uD83C\uDDEE\uD83C\uDDF3"), + native = "India", + continent = Continent.ASIA, region = Region.SOUTHERN_ASIA, + callingCode = CallingCode("+91"), currency = CurrencyCode("INR"), timezone = TimezoneId("Asia/Kolkata") ), Country( - alpha2 = Alpha2Code("MK"), - alpha3 = Alpha3Code("MKD"), - numeric = NumericCode("807"), - name = CountryName("Republic of North Macedonia"), - flag = FlagEmoji("🇲🇰"), - native = "Македонија" + alpha2 = Alpha2Code("IO"), alpha3 = Alpha3Code("IOT"), numeric = NumericCode("086"), + name = CountryName("British Indian Ocean Territory (the)"), flag = FlagEmoji("\uD83C\uDDEE\uD83C\uDDF4"), + displayName = "British Indian Ocean Territory", native = "British Indian Ocean Territory", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+246"), currency = CurrencyCode("USD"), timezone = TimezoneId("Indian/Chagos") ), Country( - alpha2 = Alpha2Code("ML"), - alpha3 = Alpha3Code("MLI"), - numeric = NumericCode("466"), - name = CountryName("Mali"), - flag = FlagEmoji("🇲🇱"), - native = "Mali" + alpha2 = Alpha2Code("IQ"), alpha3 = Alpha3Code("IRQ"), numeric = NumericCode("368"), + name = CountryName("Iraq"), flag = FlagEmoji("\uD83C\uDDEE\uD83C\uDDF6"), + native = "\u0627\u0644\u0639\u0631\u0627\u0642", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+964"), currency = CurrencyCode("IQD"), timezone = TimezoneId("Asia/Baghdad") ), Country( - alpha2 = Alpha2Code("MM"), - alpha3 = Alpha3Code("MMR"), - numeric = NumericCode("104"), - name = CountryName("Myanmar"), - flag = FlagEmoji("🇲🇲"), - native = "မြန်မာ" + alpha2 = Alpha2Code("IR"), alpha3 = Alpha3Code("IRN"), numeric = NumericCode("364"), + name = CountryName("Iran (Islamic Republic of)"), flag = FlagEmoji("\uD83C\uDDEE\uD83C\uDDF7"), + displayName = "Iran", native = "\u0627\u06CC\u0631\u0627\u0646", + continent = Continent.ASIA, region = Region.SOUTHERN_ASIA, + callingCode = CallingCode("+98"), currency = CurrencyCode("IRR"), timezone = TimezoneId("Asia/Tehran") ), Country( - alpha2 = Alpha2Code("MN"), - alpha3 = Alpha3Code("MNG"), - numeric = NumericCode("496"), - name = CountryName("Mongolia"), - flag = FlagEmoji("🇲🇳"), - native = "Монгол улс" + alpha2 = Alpha2Code("IS"), alpha3 = Alpha3Code("ISL"), numeric = NumericCode("352"), + name = CountryName("Iceland"), flag = FlagEmoji("\uD83C\uDDEE\uD83C\uDDF8"), + native = "\u00CDsland", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+354"), currency = CurrencyCode("ISK"), timezone = TimezoneId("Atlantic/Reykjavik") ), Country( - alpha2 = Alpha2Code("MO"), - alpha3 = Alpha3Code("MAC"), - numeric = NumericCode("446"), - name = CountryName("Macao"), - flag = FlagEmoji("🇲🇴"), - native = "Macau" + alpha2 = Alpha2Code("IT"), alpha3 = Alpha3Code("ITA"), numeric = NumericCode("380"), + name = CountryName("Italy"), flag = FlagEmoji("\uD83C\uDDEE\uD83C\uDDF9"), + native = "Italia", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+39"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Rome") ), Country( - alpha2 = Alpha2Code("MP"), - alpha3 = Alpha3Code("MNP"), - numeric = NumericCode("580"), - name = CountryName("Northern Mariana Islands (the)"), - flag = FlagEmoji("🇲🇵"), - displayName = "Northern Mariana Islands", - native = "Northern Mariana Islands" + alpha2 = Alpha2Code("JE"), alpha3 = Alpha3Code("JEY"), numeric = NumericCode("832"), + name = CountryName("Jersey"), flag = FlagEmoji("\uD83C\uDDEF\uD83C\uDDEA"), + native = "Jersey", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+44"), currency = CurrencyCode("GBP"), timezone = TimezoneId("Europe/Jersey") ), Country( - alpha2 = Alpha2Code("MQ"), - alpha3 = Alpha3Code("MTQ"), - numeric = NumericCode("474"), - name = CountryName("Martinique"), - flag = FlagEmoji("🇲🇶"), - native = "Martinique" + alpha2 = Alpha2Code("JM"), alpha3 = Alpha3Code("JAM"), numeric = NumericCode("388"), + name = CountryName("Jamaica"), flag = FlagEmoji("\uD83C\uDDEF\uD83C\uDDF2"), + native = "Jamaica", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("JMD"), timezone = TimezoneId("America/Jamaica") ), Country( - alpha2 = Alpha2Code("MR"), - alpha3 = Alpha3Code("MRT"), - numeric = NumericCode("478"), - name = CountryName("Mauritania"), - flag = FlagEmoji("🇲🇷"), - native = "موريتانيا" + alpha2 = Alpha2Code("JO"), alpha3 = Alpha3Code("JOR"), numeric = NumericCode("400"), + name = CountryName("Jordan"), flag = FlagEmoji("\uD83C\uDDEF\uD83C\uDDF4"), + native = "\u0627\u0644\u0623\u0631\u062F\u0646", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+962"), currency = CurrencyCode("JOD"), timezone = TimezoneId("Asia/Amman") ), Country( - alpha2 = Alpha2Code("MS"), - alpha3 = Alpha3Code("MSR"), - numeric = NumericCode("500"), - name = CountryName("Montserrat"), - flag = FlagEmoji("🇲🇸"), - native = "Montserrat" + alpha2 = Alpha2Code("JP"), alpha3 = Alpha3Code("JPN"), numeric = NumericCode("392"), + name = CountryName("Japan"), flag = FlagEmoji("\uD83C\uDDEF\uD83C\uDDF5"), + native = "\u65E5\u672C", + continent = Continent.ASIA, region = Region.EASTERN_ASIA, + callingCode = CallingCode("+81"), currency = CurrencyCode("JPY"), timezone = TimezoneId("Asia/Tokyo") ), Country( - alpha2 = Alpha2Code("MT"), - alpha3 = Alpha3Code("MLT"), - numeric = NumericCode("470"), - name = CountryName("Malta"), - flag = FlagEmoji("🇲🇹"), - native = "Malta" + alpha2 = Alpha2Code("KE"), alpha3 = Alpha3Code("KEN"), numeric = NumericCode("404"), + name = CountryName("Kenya"), flag = FlagEmoji("\uD83C\uDDF0\uD83C\uDDEA"), + native = "Kenya", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+254"), currency = CurrencyCode("KES"), timezone = TimezoneId("Africa/Nairobi") ), Country( - alpha2 = Alpha2Code("MU"), - alpha3 = Alpha3Code("MUS"), - numeric = NumericCode("480"), - name = CountryName("Mauritius"), - flag = FlagEmoji("🇲🇺"), - native = "Mauritius" + alpha2 = Alpha2Code("KG"), alpha3 = Alpha3Code("KGZ"), numeric = NumericCode("417"), + name = CountryName("Kyrgyzstan"), flag = FlagEmoji("\uD83C\uDDF0\uD83C\uDDEC"), + native = "\u041A\u044B\u0440\u0433\u044B\u0437\u0441\u0442\u0430\u043D", + continent = Continent.ASIA, region = Region.CENTRAL_ASIA, + callingCode = CallingCode("+996"), currency = CurrencyCode("KGS"), timezone = TimezoneId("Asia/Bishkek") ), Country( - alpha2 = Alpha2Code("MV"), - alpha3 = Alpha3Code("MDV"), - numeric = NumericCode("462"), - name = CountryName("Maldives"), - flag = FlagEmoji("🇲🇻"), - native = "ދިވެހިރާއްޖޭގެ" + alpha2 = Alpha2Code("KH"), alpha3 = Alpha3Code("KHM"), numeric = NumericCode("116"), + name = CountryName("Cambodia"), flag = FlagEmoji("\uD83C\uDDF0\uD83C\uDDED"), + native = "K\u00E2mp\u016Dch\u00E9a", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+855"), currency = CurrencyCode("KHR"), timezone = TimezoneId("Asia/Phnom_Penh") ), Country( - alpha2 = Alpha2Code("MW"), - alpha3 = Alpha3Code("MWI"), - numeric = NumericCode("454"), - name = CountryName("Malawi"), - flag = FlagEmoji("🇲🇼"), - native = "Malawi" + alpha2 = Alpha2Code("KI"), alpha3 = Alpha3Code("KIR"), numeric = NumericCode("296"), + name = CountryName("Kiribati"), flag = FlagEmoji("\uD83C\uDDF0\uD83C\uDDEE"), + native = "Kiribati", + continent = Continent.OCEANIA, region = Region.MICRONESIA, + callingCode = CallingCode("+686"), currency = CurrencyCode("AUD"), timezone = TimezoneId("Pacific/Tarawa") ), Country( - alpha2 = Alpha2Code("MX"), - alpha3 = Alpha3Code("MEX"), - numeric = NumericCode("484"), - name = CountryName("Mexico"), - flag = FlagEmoji("🇲🇽"), - native = "México" + alpha2 = Alpha2Code("KM"), alpha3 = Alpha3Code("COM"), numeric = NumericCode("174"), + name = CountryName("Comoros (the)"), flag = FlagEmoji("\uD83C\uDDF0\uD83C\uDDF2"), + displayName = "Comoros", native = "Komori", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+269"), currency = CurrencyCode("KMF"), timezone = TimezoneId("Indian/Comoro") ), Country( - alpha2 = Alpha2Code("MY"), - alpha3 = Alpha3Code("MYS"), - numeric = NumericCode("458"), - name = CountryName("Malaysia"), - flag = FlagEmoji("🇲🇾"), - native = "Malaysia" + alpha2 = Alpha2Code("KN"), alpha3 = Alpha3Code("KNA"), numeric = NumericCode("659"), + name = CountryName("Saint Kitts and Nevis"), flag = FlagEmoji("\uD83C\uDDF0\uD83C\uDDF3"), + native = "Saint Kitts and Nevis", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("XCD"), timezone = TimezoneId("America/St_Kitts") ), Country( - alpha2 = Alpha2Code("MZ"), - alpha3 = Alpha3Code("MOZ"), - numeric = NumericCode("508"), - name = CountryName("Mozambique"), - flag = FlagEmoji("🇲🇿"), - native = "Moçambique" + alpha2 = Alpha2Code("KP"), alpha3 = Alpha3Code("PRK"), numeric = NumericCode("408"), + name = CountryName("Korea (the Democratic People's Republic of)"), flag = FlagEmoji("\uD83C\uDDF0\uD83C\uDDF5"), + displayName = "North Korea", native = "\uC870\uC120\uBBFC\uC8FC\uC8FC\uC758\uC778\uBBFC\uACF5\uD654\uAD6D", + continent = Continent.ASIA, region = Region.EASTERN_ASIA, + callingCode = CallingCode("+850"), currency = CurrencyCode("KPW"), timezone = TimezoneId("Asia/Pyongyang") ), Country( - alpha2 = Alpha2Code("NA"), - alpha3 = Alpha3Code("NAM"), - numeric = NumericCode("516"), - name = CountryName("Namibia"), - flag = FlagEmoji("🇳🇦"), - native = "Namibië" + alpha2 = Alpha2Code("KR"), alpha3 = Alpha3Code("KOR"), numeric = NumericCode("410"), + name = CountryName("Korea (the Republic of)"), flag = FlagEmoji("\uD83C\uDDF0\uD83C\uDDF7"), + displayName = "South Korea", native = "\uB300\uD55C\uBBFC\uAD6D", + continent = Continent.ASIA, region = Region.EASTERN_ASIA, + callingCode = CallingCode("+82"), currency = CurrencyCode("KRW"), timezone = TimezoneId("Asia/Seoul") ), Country( - alpha2 = Alpha2Code("NC"), - alpha3 = Alpha3Code("NCL"), - numeric = NumericCode("540"), - name = CountryName("New Caledonia"), - flag = FlagEmoji("🇳🇨"), - native = "Nouvelle-Calédonie" + alpha2 = Alpha2Code("KW"), alpha3 = Alpha3Code("KWT"), numeric = NumericCode("414"), + name = CountryName("Kuwait"), flag = FlagEmoji("\uD83C\uDDF0\uD83C\uDDFC"), + native = "\u0627\u0644\u0643\u0648\u064A\u062A", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+965"), currency = CurrencyCode("KWD"), timezone = TimezoneId("Asia/Kuwait") ), Country( - alpha2 = Alpha2Code("NE"), - alpha3 = Alpha3Code("NER"), - numeric = NumericCode("562"), - name = CountryName("Niger (the)"), - flag = FlagEmoji("🇳🇪"), - displayName = "Niger", - native = "Niger" + alpha2 = Alpha2Code("KY"), alpha3 = Alpha3Code("CYM"), numeric = NumericCode("136"), + name = CountryName("Cayman Islands (the)"), flag = FlagEmoji("\uD83C\uDDF0\uD83C\uDDFE"), + displayName = "Cayman Islands", native = "Cayman Islands", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("KYD"), timezone = TimezoneId("America/Cayman") ), Country( - alpha2 = Alpha2Code("NF"), - alpha3 = Alpha3Code("NFK"), - numeric = NumericCode("574"), - name = CountryName("Norfolk Island"), - flag = FlagEmoji("🇳🇫"), - native = "Norfolk Island" + alpha2 = Alpha2Code("KZ"), alpha3 = Alpha3Code("KAZ"), numeric = NumericCode("398"), + name = CountryName("Kazakhstan"), flag = FlagEmoji("\uD83C\uDDF0\uD83C\uDDFF"), + native = "\u049A\u0430\u0437\u0430\u049B\u0441\u0442\u0430\u043D", + continent = Continent.ASIA, region = Region.CENTRAL_ASIA, + callingCode = CallingCode("+7"), currency = CurrencyCode("KZT"), timezone = TimezoneId("Asia/Almaty") ), Country( - alpha2 = Alpha2Code("NG"), - alpha3 = Alpha3Code("NGA"), - numeric = NumericCode("566"), - name = CountryName("Nigeria"), - flag = FlagEmoji("🇳🇬"), - native = "Nigeria" + alpha2 = Alpha2Code("LA"), alpha3 = Alpha3Code("LAO"), numeric = NumericCode("418"), + name = CountryName("Lao People's Democratic Republic (the)"), flag = FlagEmoji("\uD83C\uDDF1\uD83C\uDDE6"), + displayName = "Laos", native = "\u0EA5\u0EB2\u0EA7", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+856"), currency = CurrencyCode("LAK"), timezone = TimezoneId("Asia/Vientiane") ), Country( - alpha2 = Alpha2Code("NI"), - alpha3 = Alpha3Code("NIC"), - numeric = NumericCode("558"), - name = CountryName("Nicaragua"), - flag = FlagEmoji("🇳🇮"), - native = "Nicaragua" + alpha2 = Alpha2Code("LB"), alpha3 = Alpha3Code("LBN"), numeric = NumericCode("422"), + name = CountryName("Lebanon"), flag = FlagEmoji("\uD83C\uDDF1\uD83C\uDDE7"), + native = "\u0644\u0628\u0646\u0627\u0646", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+961"), currency = CurrencyCode("LBP"), timezone = TimezoneId("Asia/Beirut") ), Country( - alpha2 = Alpha2Code("NL"), - alpha3 = Alpha3Code("NLD"), - numeric = NumericCode("528"), - name = CountryName("Netherlands (the)"), - flag = FlagEmoji("🇳🇱"), - displayName = "Netherlands", - native = "Nederland" + alpha2 = Alpha2Code("LC"), alpha3 = Alpha3Code("LCA"), numeric = NumericCode("662"), + name = CountryName("Saint Lucia"), flag = FlagEmoji("\uD83C\uDDF1\uD83C\uDDE8"), + native = "Saint Lucia", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("XCD"), timezone = TimezoneId("America/St_Lucia") ), Country( - alpha2 = Alpha2Code("NO"), - alpha3 = Alpha3Code("NOR"), - numeric = NumericCode("578"), - name = CountryName("Norway"), - flag = FlagEmoji("🇳🇴"), - native = "Noreg" + alpha2 = Alpha2Code("LI"), alpha3 = Alpha3Code("LIE"), numeric = NumericCode("438"), + name = CountryName("Liechtenstein"), flag = FlagEmoji("\uD83C\uDDF1\uD83C\uDDEE"), + native = "Liechtenstein", + continent = Continent.EUROPE, region = Region.WESTERN_EUROPE, + callingCode = CallingCode("+423"), currency = CurrencyCode("CHF"), timezone = TimezoneId("Europe/Vaduz") ), Country( - alpha2 = Alpha2Code("NP"), - alpha3 = Alpha3Code("NPL"), - numeric = NumericCode("524"), - name = CountryName("Nepal"), - flag = FlagEmoji("🇳🇵"), - native = "नेपाल" + alpha2 = Alpha2Code("LK"), alpha3 = Alpha3Code("LKA"), numeric = NumericCode("144"), + name = CountryName("Sri Lanka"), flag = FlagEmoji("\uD83C\uDDF1\uD83C\uDDF0"), + native = "\u0DC1\u0DCA\u200D\u0DBB\u0DD3 \u0DBD\u0D82\u0D9A\u0DCF\u0DC0", + continent = Continent.ASIA, region = Region.SOUTHERN_ASIA, + callingCode = CallingCode("+94"), currency = CurrencyCode("LKR"), timezone = TimezoneId("Asia/Colombo") ), Country( - alpha2 = Alpha2Code("NR"), - alpha3 = Alpha3Code("NRU"), - numeric = NumericCode("520"), - name = CountryName("Nauru"), - flag = FlagEmoji("🇳🇷"), - native = "Nauru" + alpha2 = Alpha2Code("LR"), alpha3 = Alpha3Code("LBR"), numeric = NumericCode("430"), + name = CountryName("Liberia"), flag = FlagEmoji("\uD83C\uDDF1\uD83C\uDDF7"), + native = "Liberia", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+231"), currency = CurrencyCode("LRD"), timezone = TimezoneId("Africa/Monrovia") ), Country( - alpha2 = Alpha2Code("NU"), - alpha3 = Alpha3Code("NIU"), - numeric = NumericCode("570"), - name = CountryName("Niue"), - flag = FlagEmoji("🇳🇺"), - native = "Niue" + alpha2 = Alpha2Code("LS"), alpha3 = Alpha3Code("LSO"), numeric = NumericCode("426"), + name = CountryName("Lesotho"), flag = FlagEmoji("\uD83C\uDDF1\uD83C\uDDF8"), + native = "Lesotho", + continent = Continent.AFRICA, region = Region.SOUTHERN_AFRICA, + callingCode = CallingCode("+266"), currency = CurrencyCode("LSL"), timezone = TimezoneId("Africa/Maseru") ), Country( - alpha2 = Alpha2Code("NZ"), - alpha3 = Alpha3Code("NZL"), - numeric = NumericCode("554"), - name = CountryName("New Zealand"), - flag = FlagEmoji("🇳🇿"), - native = "New Zealand" + alpha2 = Alpha2Code("LT"), alpha3 = Alpha3Code("LTU"), numeric = NumericCode("440"), + name = CountryName("Lithuania"), flag = FlagEmoji("\uD83C\uDDF1\uD83C\uDDF9"), + native = "Lietuva", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+370"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Vilnius") ), Country( - alpha2 = Alpha2Code("OM"), - alpha3 = Alpha3Code("OMN"), - numeric = NumericCode("512"), - name = CountryName("Oman"), - flag = FlagEmoji("🇴🇲"), - native = "عمان" + alpha2 = Alpha2Code("LU"), alpha3 = Alpha3Code("LUX"), numeric = NumericCode("442"), + name = CountryName("Luxembourg"), flag = FlagEmoji("\uD83C\uDDF1\uD83C\uDDFA"), + native = "Luxemburg", + continent = Continent.EUROPE, region = Region.WESTERN_EUROPE, + callingCode = CallingCode("+352"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Luxembourg") ), Country( - alpha2 = Alpha2Code("PA"), - alpha3 = Alpha3Code("PAN"), - numeric = NumericCode("591"), - name = CountryName("Panama"), - flag = FlagEmoji("🇵🇦"), - native = "Panamá" + alpha2 = Alpha2Code("LV"), alpha3 = Alpha3Code("LVA"), numeric = NumericCode("428"), + name = CountryName("Latvia"), flag = FlagEmoji("\uD83C\uDDF1\uD83C\uDDFB"), + native = "Latvija", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+371"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Riga") ), Country( - alpha2 = Alpha2Code("PE"), - alpha3 = Alpha3Code("PER"), - numeric = NumericCode("604"), - name = CountryName("Peru"), - flag = FlagEmoji("🇵🇪"), - native = "Piruw" + alpha2 = Alpha2Code("LY"), alpha3 = Alpha3Code("LBY"), numeric = NumericCode("434"), + name = CountryName("Libya"), flag = FlagEmoji("\uD83C\uDDF1\uD83C\uDDFE"), + native = "\u200F\u0644\u064A\u0628\u064A\u0627", + continent = Continent.AFRICA, region = Region.NORTHERN_AFRICA, + callingCode = CallingCode("+218"), currency = CurrencyCode("LYD"), timezone = TimezoneId("Africa/Tripoli") ), Country( - alpha2 = Alpha2Code("PF"), - alpha3 = Alpha3Code("PYF"), - numeric = NumericCode("258"), - name = CountryName("French Polynesia"), - flag = FlagEmoji("🇵🇫"), - native = "Polynésie française" + alpha2 = Alpha2Code("MA"), alpha3 = Alpha3Code("MAR"), numeric = NumericCode("504"), + name = CountryName("Morocco"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDE6"), + native = "\u0627\u0644\u0645\u063A\u0631\u0628", + continent = Continent.AFRICA, region = Region.NORTHERN_AFRICA, + callingCode = CallingCode("+212"), currency = CurrencyCode("MAD"), timezone = TimezoneId("Africa/Casablanca") ), Country( - alpha2 = Alpha2Code("PG"), - alpha3 = Alpha3Code("PNG"), - numeric = NumericCode("598"), - name = CountryName("Papua New Guinea"), - flag = FlagEmoji("🇵🇬"), - native = "Papua New Guinea" + alpha2 = Alpha2Code("MC"), alpha3 = Alpha3Code("MCO"), numeric = NumericCode("492"), + name = CountryName("Monaco"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDE8"), + native = "Monaco", + continent = Continent.EUROPE, region = Region.WESTERN_EUROPE, + callingCode = CallingCode("+377"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Monaco") ), Country( - alpha2 = Alpha2Code("PH"), - alpha3 = Alpha3Code("PHL"), - numeric = NumericCode("608"), - name = CountryName("Philippines (the)"), - flag = FlagEmoji("🇵🇭"), - displayName = "Philippines", - native = "Pilipinas" + alpha2 = Alpha2Code("MD"), alpha3 = Alpha3Code("MDA"), numeric = NumericCode("498"), + name = CountryName("Moldova (the Republic of)"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDE9"), + displayName = "Moldova", native = "Moldova", + continent = Continent.EUROPE, region = Region.EASTERN_EUROPE, + callingCode = CallingCode("+373"), currency = CurrencyCode("MDL"), timezone = TimezoneId("Europe/Chisinau") ), Country( - alpha2 = Alpha2Code("PK"), - alpha3 = Alpha3Code("PAK"), - numeric = NumericCode("586"), - name = CountryName("Pakistan"), - flag = FlagEmoji("🇵🇰"), - native = "Pakistan" + alpha2 = Alpha2Code("ME"), alpha3 = Alpha3Code("MNE"), numeric = NumericCode("499"), + name = CountryName("Montenegro"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDEA"), + native = "\u0426\u0440\u043D\u0430 \u0413\u043E\u0440\u0430", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+382"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Podgorica") ), Country( - alpha2 = Alpha2Code("PL"), - alpha3 = Alpha3Code("POL"), - numeric = NumericCode("616"), - name = CountryName("Poland"), - flag = FlagEmoji("🇵🇱"), - native = "Polska" + alpha2 = Alpha2Code("MF"), alpha3 = Alpha3Code("MAF"), numeric = NumericCode("663"), + name = CountryName("Saint Martin (French part)"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDEB"), + native = "Saint-Martin", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+590"), currency = CurrencyCode("EUR"), timezone = TimezoneId("America/Marigot") ), Country( - alpha2 = Alpha2Code("PM"), - alpha3 = Alpha3Code("SPM"), - numeric = NumericCode("666"), - name = CountryName("Saint Pierre and Miquelon"), - flag = FlagEmoji("🇵🇲"), - native = "Saint-Pierre-et-Miquelon" + alpha2 = Alpha2Code("MG"), alpha3 = Alpha3Code("MDG"), numeric = NumericCode("450"), + name = CountryName("Madagascar"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDEC"), + native = "Madagascar", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+261"), currency = CurrencyCode("MGA"), timezone = TimezoneId("Indian/Antananarivo") ), Country( - alpha2 = Alpha2Code("PN"), - alpha3 = Alpha3Code("PCN"), - numeric = NumericCode("612"), - name = CountryName("Pitcairn"), - flag = FlagEmoji("🇵🇳"), - native = "Pitcairn Islands" + alpha2 = Alpha2Code("MH"), alpha3 = Alpha3Code("MHL"), numeric = NumericCode("584"), + name = CountryName("Marshall Islands (the)"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDED"), + displayName = "Marshall Islands", native = "Marshall Islands", + continent = Continent.OCEANIA, region = Region.MICRONESIA, + callingCode = CallingCode("+692"), currency = CurrencyCode("USD"), timezone = TimezoneId("Pacific/Majuro") ), Country( - alpha2 = Alpha2Code("PR"), - alpha3 = Alpha3Code("PRI"), - numeric = NumericCode("630"), - name = CountryName("Puerto Rico"), - flag = FlagEmoji("🇵🇷"), - native = "Puerto Rico" + alpha2 = Alpha2Code("MK"), alpha3 = Alpha3Code("MKD"), numeric = NumericCode("807"), + name = CountryName("Republic of North Macedonia"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDF0"), + native = "\u041C\u0430\u043A\u0435\u0434\u043E\u043D\u0438\u0458\u0430", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+389"), currency = CurrencyCode("MKD"), timezone = TimezoneId("Europe/Skopje") ), Country( - alpha2 = Alpha2Code("PS"), - alpha3 = Alpha3Code("PSE"), - numeric = NumericCode("275"), - name = CountryName("Palestine, State of"), - flag = FlagEmoji("🇵🇸"), - displayName = "Palestine", - native = "فلسطين" + alpha2 = Alpha2Code("ML"), alpha3 = Alpha3Code("MLI"), numeric = NumericCode("466"), + name = CountryName("Mali"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDF1"), + native = "Mali", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+223"), currency = CurrencyCode("XOF"), timezone = TimezoneId("Africa/Bamako") ), Country( - alpha2 = Alpha2Code("PT"), - alpha3 = Alpha3Code("PRT"), - numeric = NumericCode("620"), - name = CountryName("Portugal"), - flag = FlagEmoji("🇵🇹"), - native = "Portugal" + alpha2 = Alpha2Code("MM"), alpha3 = Alpha3Code("MMR"), numeric = NumericCode("104"), + name = CountryName("Myanmar"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDF2"), + native = "\u1019\u103C\u1014\u103A\u1019\u102C", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+95"), currency = CurrencyCode("MMK"), timezone = TimezoneId("Asia/Yangon") ), Country( - alpha2 = Alpha2Code("PW"), - alpha3 = Alpha3Code("PLW"), - numeric = NumericCode("585"), - name = CountryName("Palau"), - flag = FlagEmoji("🇵🇼"), - native = "Palau" + alpha2 = Alpha2Code("MN"), alpha3 = Alpha3Code("MNG"), numeric = NumericCode("496"), + name = CountryName("Mongolia"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDF3"), + native = "\u041C\u043E\u043D\u0433\u043E\u043B \u0443\u043B\u0441", + continent = Continent.ASIA, region = Region.EASTERN_ASIA, + callingCode = CallingCode("+976"), currency = CurrencyCode("MNT"), timezone = TimezoneId("Asia/Ulaanbaatar") ), Country( - alpha2 = Alpha2Code("PY"), - alpha3 = Alpha3Code("PRY"), - numeric = NumericCode("600"), - name = CountryName("Paraguay"), - flag = FlagEmoji("🇵🇾"), - native = "Paraguái" + alpha2 = Alpha2Code("MO"), alpha3 = Alpha3Code("MAC"), numeric = NumericCode("446"), + name = CountryName("Macao"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDF4"), + native = "Macau", + continent = Continent.ASIA, region = Region.EASTERN_ASIA, + callingCode = CallingCode("+853"), currency = CurrencyCode("MOP"), timezone = TimezoneId("Asia/Macau") ), Country( - alpha2 = Alpha2Code("QA"), - alpha3 = Alpha3Code("QAT"), - numeric = NumericCode("634"), - name = CountryName("Qatar"), - flag = FlagEmoji("🇶🇦"), - native = "قطر" + alpha2 = Alpha2Code("MP"), alpha3 = Alpha3Code("MNP"), numeric = NumericCode("580"), + name = CountryName("Northern Mariana Islands (the)"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDF5"), + displayName = "Northern Mariana Islands", native = "Northern Mariana Islands", + continent = Continent.OCEANIA, region = Region.MICRONESIA, + callingCode = CallingCode("+1"), currency = CurrencyCode("USD"), timezone = TimezoneId("Pacific/Guam") ), Country( - alpha2 = Alpha2Code("RE"), - alpha3 = Alpha3Code("REU"), - numeric = NumericCode("638"), - name = CountryName("Réunion"), - flag = FlagEmoji("🇷🇪"), - native = "La Réunion" + alpha2 = Alpha2Code("MQ"), alpha3 = Alpha3Code("MTQ"), numeric = NumericCode("474"), + name = CountryName("Martinique"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDF6"), + native = "Martinique", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+596"), currency = CurrencyCode("EUR"), timezone = TimezoneId("America/Martinique") ), Country( - alpha2 = Alpha2Code("RO"), - alpha3 = Alpha3Code("ROU"), - numeric = NumericCode("642"), - name = CountryName("Romania"), - flag = FlagEmoji("🇷🇴"), - native = "România" + alpha2 = Alpha2Code("MR"), alpha3 = Alpha3Code("MRT"), numeric = NumericCode("478"), + name = CountryName("Mauritania"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDF7"), + native = "\u0645\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u0627", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+222"), currency = CurrencyCode("MRU"), timezone = TimezoneId("Africa/Nouakchott") ), Country( - alpha2 = Alpha2Code("RS"), - alpha3 = Alpha3Code("SRB"), - numeric = NumericCode("688"), - name = CountryName("Serbia"), - flag = FlagEmoji("🇷🇸"), - native = "Србија" + alpha2 = Alpha2Code("MS"), alpha3 = Alpha3Code("MSR"), numeric = NumericCode("500"), + name = CountryName("Montserrat"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDF8"), + native = "Montserrat", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("XCD"), timezone = TimezoneId("America/Montserrat") ), Country( - alpha2 = Alpha2Code("RU"), - alpha3 = Alpha3Code("RUS"), - numeric = NumericCode("643"), - name = CountryName("Russian Federation (the)"), - flag = FlagEmoji("🇷🇺"), - displayName = "Russia", - native = "Россия" + alpha2 = Alpha2Code("MT"), alpha3 = Alpha3Code("MLT"), numeric = NumericCode("470"), + name = CountryName("Malta"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDF9"), + native = "Malta", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+356"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Malta") ), Country( - alpha2 = Alpha2Code("RW"), - alpha3 = Alpha3Code("RWA"), - numeric = NumericCode("646"), - name = CountryName("Rwanda"), - flag = FlagEmoji("🇷🇼"), - native = "Rwanda" + alpha2 = Alpha2Code("MU"), alpha3 = Alpha3Code("MUS"), numeric = NumericCode("480"), + name = CountryName("Mauritius"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDFA"), + native = "Mauritius", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+230"), currency = CurrencyCode("MUR"), timezone = TimezoneId("Indian/Mauritius") ), Country( - alpha2 = Alpha2Code("SA"), - alpha3 = Alpha3Code("SAU"), - numeric = NumericCode("682"), - name = CountryName("Saudi Arabia"), - flag = FlagEmoji("🇸🇦"), - native = "العربية السعودية" + alpha2 = Alpha2Code("MV"), alpha3 = Alpha3Code("MDV"), numeric = NumericCode("462"), + name = CountryName("Maldives"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDFB"), + native = "\u078B\u07A8\u0788\u07AC\u0780\u07A8\u0783\u07A7\u0787\u07B0\u0796\u07AD\u078E\u07AC", + continent = Continent.ASIA, region = Region.SOUTHERN_ASIA, + callingCode = CallingCode("+960"), currency = CurrencyCode("MVR"), timezone = TimezoneId("Indian/Maldives") ), Country( - alpha2 = Alpha2Code("SB"), - alpha3 = Alpha3Code("SLB"), - numeric = NumericCode("090"), - name = CountryName("Solomon Islands"), - flag = FlagEmoji("🇸🇧"), - native = "Solomon Islands" + alpha2 = Alpha2Code("MW"), alpha3 = Alpha3Code("MWI"), numeric = NumericCode("454"), + name = CountryName("Malawi"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDFC"), + native = "Malawi", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+265"), currency = CurrencyCode("MWK"), timezone = TimezoneId("Africa/Blantyre") ), Country( - alpha2 = Alpha2Code("SC"), - alpha3 = Alpha3Code("SYC"), - numeric = NumericCode("690"), - name = CountryName("Seychelles"), - flag = FlagEmoji("🇸🇨"), - native = "Sesel" + alpha2 = Alpha2Code("MX"), alpha3 = Alpha3Code("MEX"), numeric = NumericCode("484"), + name = CountryName("Mexico"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDFD"), + native = "M\u00E9xico", + continent = Continent.NORTH_AMERICA, region = Region.CENTRAL_AMERICA, + callingCode = CallingCode("+52"), currency = CurrencyCode("MXN"), timezone = TimezoneId("America/Mexico_City") ), Country( - alpha2 = Alpha2Code("SD"), - alpha3 = Alpha3Code("SDN"), - numeric = NumericCode("729"), - name = CountryName("Sudan (the)"), - flag = FlagEmoji("🇸🇩"), - displayName = "Sudan", - native = "السودان" + alpha2 = Alpha2Code("MY"), alpha3 = Alpha3Code("MYS"), numeric = NumericCode("458"), + name = CountryName("Malaysia"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDFE"), + native = "Malaysia", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+60"), currency = CurrencyCode("MYR"), timezone = TimezoneId("Asia/Kuala_Lumpur") ), Country( - alpha2 = Alpha2Code("SE"), - alpha3 = Alpha3Code("SWE"), - numeric = NumericCode("752"), - name = CountryName("Sweden"), - flag = FlagEmoji("🇸🇪"), - native = "Sverige" + alpha2 = Alpha2Code("MZ"), alpha3 = Alpha3Code("MOZ"), numeric = NumericCode("508"), + name = CountryName("Mozambique"), flag = FlagEmoji("\uD83C\uDDF2\uD83C\uDDFF"), + native = "Mo\u00E7ambique", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+258"), currency = CurrencyCode("MZN"), timezone = TimezoneId("Africa/Maputo") ), Country( - alpha2 = Alpha2Code("SG"), - alpha3 = Alpha3Code("SGP"), - numeric = NumericCode("702"), - name = CountryName("Singapore"), - flag = FlagEmoji("🇸🇬"), - native = "Singapore" + alpha2 = Alpha2Code("NA"), alpha3 = Alpha3Code("NAM"), numeric = NumericCode("516"), + name = CountryName("Namibia"), flag = FlagEmoji("\uD83C\uDDF3\uD83C\uDDE6"), + native = "Namibi\u00EB", + continent = Continent.AFRICA, region = Region.SOUTHERN_AFRICA, + callingCode = CallingCode("+264"), currency = CurrencyCode("NAD"), timezone = TimezoneId("Africa/Windhoek") ), Country( - alpha2 = Alpha2Code("SH"), - alpha3 = Alpha3Code("SHN"), - numeric = NumericCode("654"), - name = CountryName("Saint Helena, Ascension and Tristan da Cunha"), - flag = FlagEmoji("🇸🇭"), - native = "Saint Helena, Ascension and Tristan da Cunha" + alpha2 = Alpha2Code("NC"), alpha3 = Alpha3Code("NCL"), numeric = NumericCode("540"), + name = CountryName("New Caledonia"), flag = FlagEmoji("\uD83C\uDDF3\uD83C\uDDE8"), + native = "Nouvelle-Cal\u00E9donie", + continent = Continent.OCEANIA, region = Region.MELANESIA, + callingCode = CallingCode("+687"), currency = CurrencyCode("XPF"), timezone = TimezoneId("Pacific/Noumea") ), Country( - alpha2 = Alpha2Code("SI"), - alpha3 = Alpha3Code("SVN"), - numeric = NumericCode("705"), - name = CountryName("Slovenia"), - flag = FlagEmoji("🇸🇮"), - native = "Slovenija" + alpha2 = Alpha2Code("NE"), alpha3 = Alpha3Code("NER"), numeric = NumericCode("562"), + name = CountryName("Niger (the)"), flag = FlagEmoji("\uD83C\uDDF3\uD83C\uDDEA"), + displayName = "Niger", native = "Niger", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+227"), currency = CurrencyCode("XOF"), timezone = TimezoneId("Africa/Niamey") ), Country( - alpha2 = Alpha2Code("SJ"), - alpha3 = Alpha3Code("SJM"), - numeric = NumericCode("744"), - name = CountryName("Svalbard and Jan Mayen"), - flag = FlagEmoji("🇸🇯"), - native = "Svalbard og Jan Mayen" + alpha2 = Alpha2Code("NF"), alpha3 = Alpha3Code("NFK"), numeric = NumericCode("574"), + name = CountryName("Norfolk Island"), flag = FlagEmoji("\uD83C\uDDF3\uD83C\uDDEB"), + native = "Norfolk Island", + continent = Continent.OCEANIA, region = Region.AUSTRALIA_AND_NEW_ZEALAND, + callingCode = CallingCode("+672"), currency = CurrencyCode("AUD"), timezone = TimezoneId("Pacific/Norfolk") ), Country( - alpha2 = Alpha2Code("SK"), - alpha3 = Alpha3Code("SVK"), - numeric = NumericCode("703"), - name = CountryName("Slovakia"), - flag = FlagEmoji("🇸🇰"), - native = "Slovensko" + alpha2 = Alpha2Code("NG"), alpha3 = Alpha3Code("NGA"), numeric = NumericCode("566"), + name = CountryName("Nigeria"), flag = FlagEmoji("\uD83C\uDDF3\uD83C\uDDEC"), + native = "Nigeria", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+234"), currency = CurrencyCode("NGN"), timezone = TimezoneId("Africa/Lagos") ), Country( - alpha2 = Alpha2Code("SL"), - alpha3 = Alpha3Code("SLE"), - numeric = NumericCode("694"), - name = CountryName("Sierra Leone"), - flag = FlagEmoji("🇸🇱"), - native = "Sierra Leone" + alpha2 = Alpha2Code("NI"), alpha3 = Alpha3Code("NIC"), numeric = NumericCode("558"), + name = CountryName("Nicaragua"), flag = FlagEmoji("\uD83C\uDDF3\uD83C\uDDEE"), + native = "Nicaragua", + continent = Continent.NORTH_AMERICA, region = Region.CENTRAL_AMERICA, + callingCode = CallingCode("+505"), currency = CurrencyCode("NIO"), timezone = TimezoneId("America/Managua") ), Country( - alpha2 = Alpha2Code("SM"), - alpha3 = Alpha3Code("SMR"), - numeric = NumericCode("674"), - name = CountryName("San Marino"), - flag = FlagEmoji("🇸🇲"), - native = "San Marino" - ), + alpha2 = Alpha2Code("NL"), alpha3 = Alpha3Code("NLD"), numeric = NumericCode("528"), + name = CountryName("Netherlands (the)"), flag = FlagEmoji("\uD83C\uDDF3\uD83C\uDDF1"), + displayName = "Netherlands", native = "Nederland", + continent = Continent.EUROPE, region = Region.WESTERN_EUROPE, + callingCode = CallingCode("+31"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Amsterdam") + ), Country( - alpha2 = Alpha2Code("SN"), - alpha3 = Alpha3Code("SEN"), - numeric = NumericCode("686"), - name = CountryName("Senegal"), - flag = FlagEmoji("🇸🇳"), - native = "Sénégal" - ), + alpha2 = Alpha2Code("NO"), alpha3 = Alpha3Code("NOR"), numeric = NumericCode("578"), + name = CountryName("Norway"), flag = FlagEmoji("\uD83C\uDDF3\uD83C\uDDF4"), + native = "Noreg", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+47"), currency = CurrencyCode("NOK"), timezone = TimezoneId("Europe/Oslo") + ), Country( - alpha2 = Alpha2Code("SO"), - alpha3 = Alpha3Code("SOM"), - numeric = NumericCode("706"), - name = CountryName("Somalia"), - flag = FlagEmoji("🇸🇴"), - native = "الصومال‎‎" - ), + alpha2 = Alpha2Code("NP"), alpha3 = Alpha3Code("NPL"), numeric = NumericCode("524"), + name = CountryName("Nepal"), flag = FlagEmoji("\uD83C\uDDF3\uD83C\uDDF5"), + native = "\u0928\u0947\u092A\u093E\u0932", + continent = Continent.ASIA, region = Region.SOUTHERN_ASIA, + callingCode = CallingCode("+977"), currency = CurrencyCode("NPR"), timezone = TimezoneId("Asia/Kathmandu") + ), Country( - alpha2 = Alpha2Code("SR"), - alpha3 = Alpha3Code("SUR"), - numeric = NumericCode("740"), - name = CountryName("Suriname"), - flag = FlagEmoji("🇸🇷"), - native = "Suriname" - ), + alpha2 = Alpha2Code("NR"), alpha3 = Alpha3Code("NRU"), numeric = NumericCode("520"), + name = CountryName("Nauru"), flag = FlagEmoji("\uD83C\uDDF3\uD83C\uDDF7"), + native = "Nauru", + continent = Continent.OCEANIA, region = Region.MICRONESIA, + callingCode = CallingCode("+674"), currency = CurrencyCode("AUD"), timezone = TimezoneId("Pacific/Nauru") + ), Country( - alpha2 = Alpha2Code("SS"), - alpha3 = Alpha3Code("SSD"), - numeric = NumericCode("728"), - name = CountryName("South Sudan"), - flag = FlagEmoji("🇸🇸"), - native = "South Sudan" - ), + alpha2 = Alpha2Code("NU"), alpha3 = Alpha3Code("NIU"), numeric = NumericCode("570"), + name = CountryName("Niue"), flag = FlagEmoji("\uD83C\uDDF3\uD83C\uDDFA"), + native = "Niue", + continent = Continent.OCEANIA, region = Region.POLYNESIA, + callingCode = CallingCode("+683"), currency = CurrencyCode("NZD"), timezone = TimezoneId("Pacific/Niue") + ), Country( - alpha2 = Alpha2Code("ST"), - alpha3 = Alpha3Code("STP"), - numeric = NumericCode("678"), - name = CountryName("Sao Tome and Principe"), - flag = FlagEmoji("🇸🇹"), - displayName = "São Tomé and Príncipe", - native = "São Tomé e Príncipe" + alpha2 = Alpha2Code("NZ"), alpha3 = Alpha3Code("NZL"), numeric = NumericCode("554"), + name = CountryName("New Zealand"), flag = FlagEmoji("\uD83C\uDDF3\uD83C\uDDFF"), + native = "New Zealand", + continent = Continent.OCEANIA, region = Region.AUSTRALIA_AND_NEW_ZEALAND, + callingCode = CallingCode("+64"), currency = CurrencyCode("NZD"), timezone = TimezoneId("Pacific/Auckland") ), Country( - alpha2 = Alpha2Code("SV"), - alpha3 = Alpha3Code("SLV"), - numeric = NumericCode("222"), - name = CountryName("El Salvador"), - flag = FlagEmoji("🇸🇻"), - native = "El Salvador" + alpha2 = Alpha2Code("OM"), alpha3 = Alpha3Code("OMN"), numeric = NumericCode("512"), + name = CountryName("Oman"), flag = FlagEmoji("\uD83C\uDDF4\uD83C\uDDF2"), + native = "\u0639\u0645\u0627\u0646", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+968"), currency = CurrencyCode("OMR"), timezone = TimezoneId("Asia/Muscat") ), Country( - alpha2 = Alpha2Code("SX"), - alpha3 = Alpha3Code("SXM"), - numeric = NumericCode("534"), - name = CountryName("Sint Maarten (Dutch part)"), - flag = FlagEmoji("🇸🇽"), - native = "Sint Maarten" + alpha2 = Alpha2Code("PA"), alpha3 = Alpha3Code("PAN"), numeric = NumericCode("591"), + name = CountryName("Panama"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDE6"), + native = "Panam\u00E1", + continent = Continent.NORTH_AMERICA, region = Region.CENTRAL_AMERICA, + callingCode = CallingCode("+507"), currency = CurrencyCode("PAB"), timezone = TimezoneId("America/Panama") ), Country( - alpha2 = Alpha2Code("SY"), - alpha3 = Alpha3Code("SYR"), - numeric = NumericCode("760"), - name = CountryName("Syrian Arab Republic"), - flag = FlagEmoji("🇸🇾"), - displayName = "Syria", - native = "سوريا" + alpha2 = Alpha2Code("PE"), alpha3 = Alpha3Code("PER"), numeric = NumericCode("604"), + name = CountryName("Peru"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDEA"), + native = "Per\u00FA", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+51"), currency = CurrencyCode("PEN"), timezone = TimezoneId("America/Lima") ), Country( - alpha2 = Alpha2Code("SZ"), - alpha3 = Alpha3Code("SWZ"), - numeric = NumericCode("748"), - name = CountryName("Eswatini"), - flag = FlagEmoji("🇸🇿"), - native = "Eswatini" + alpha2 = Alpha2Code("PF"), alpha3 = Alpha3Code("PYF"), numeric = NumericCode("258"), + name = CountryName("French Polynesia"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDEB"), + native = "Polyn\u00E9sie fran\u00E7aise", + continent = Continent.OCEANIA, region = Region.POLYNESIA, + callingCode = CallingCode("+689"), currency = CurrencyCode("XPF"), timezone = TimezoneId("Pacific/Tahiti") ), Country( - alpha2 = Alpha2Code("TC"), - alpha3 = Alpha3Code("TCA"), - numeric = NumericCode("796"), - name = CountryName("Turks and Caicos Islands (the)"), - flag = FlagEmoji("🇹🇨"), - displayName = "Turks and Caicos Islands", - native = "Turks and Caicos Islands" + alpha2 = Alpha2Code("PG"), alpha3 = Alpha3Code("PNG"), numeric = NumericCode("598"), + name = CountryName("Papua New Guinea"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDEC"), + native = "Papua New Guinea", + continent = Continent.OCEANIA, region = Region.MELANESIA, + callingCode = CallingCode("+675"), currency = CurrencyCode("PGK"), timezone = TimezoneId("Pacific/Port_Moresby") ), Country( - alpha2 = Alpha2Code("TD"), - alpha3 = Alpha3Code("TCD"), - numeric = NumericCode("148"), - name = CountryName("Chad"), - flag = FlagEmoji("🇹🇩"), - native = "تشاد‎" + alpha2 = Alpha2Code("PH"), alpha3 = Alpha3Code("PHL"), numeric = NumericCode("608"), + name = CountryName("Philippines (the)"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDED"), + displayName = "Philippines", native = "Pilipinas", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+63"), currency = CurrencyCode("PHP"), timezone = TimezoneId("Asia/Manila") ), Country( - alpha2 = Alpha2Code("TF"), - alpha3 = Alpha3Code("ATF"), - numeric = NumericCode("260"), - name = CountryName("French Southern Territories (the)"), - flag = FlagEmoji("🇹🇫"), - displayName = "French Southern Territories", - native = "Terres australes françaises" + alpha2 = Alpha2Code("PK"), alpha3 = Alpha3Code("PAK"), numeric = NumericCode("586"), + name = CountryName("Pakistan"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDF0"), + native = "Pakistan", + continent = Continent.ASIA, region = Region.SOUTHERN_ASIA, + callingCode = CallingCode("+92"), currency = CurrencyCode("PKR"), timezone = TimezoneId("Asia/Karachi") ), - Country( - alpha2 = Alpha2Code("TG"), - alpha3 = Alpha3Code("TGO"), - numeric = NumericCode("768"), - name = CountryName("Togo"), - flag = FlagEmoji("🇹🇬"), - native = "Togo" + Country( + alpha2 = Alpha2Code("PL"), alpha3 = Alpha3Code("POL"), numeric = NumericCode("616"), + name = CountryName("Poland"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDF1"), + native = "Polska", + continent = Continent.EUROPE, region = Region.EASTERN_EUROPE, + callingCode = CallingCode("+48"), currency = CurrencyCode("PLN"), timezone = TimezoneId("Europe/Warsaw") ), - Country( - alpha2 = Alpha2Code("TH"), - alpha3 = Alpha3Code("THA"), - numeric = NumericCode("764"), - name = CountryName("Thailand"), - flag = FlagEmoji("🇹🇭"), - native = "ประเทศไทย" + Country( + alpha2 = Alpha2Code("PM"), alpha3 = Alpha3Code("SPM"), numeric = NumericCode("666"), + name = CountryName("Saint Pierre and Miquelon"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDF2"), + native = "Saint-Pierre-et-Miquelon", + continent = Continent.NORTH_AMERICA, region = Region.NORTHERN_AMERICA, + callingCode = CallingCode("+508"), currency = CurrencyCode("EUR"), timezone = TimezoneId("America/Miquelon") ), - Country( - alpha2 = Alpha2Code("TJ"), - alpha3 = Alpha3Code("TJK"), - numeric = NumericCode("762"), - name = CountryName("Tajikistan"), - flag = FlagEmoji("🇹🇯"), - native = "Таджикистан" + Country( + alpha2 = Alpha2Code("PN"), alpha3 = Alpha3Code("PCN"), numeric = NumericCode("612"), + name = CountryName("Pitcairn"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDF3"), + native = "Pitcairn Islands", + continent = Continent.OCEANIA, region = Region.POLYNESIA, + callingCode = CallingCode("+64"), currency = CurrencyCode("NZD"), timezone = TimezoneId("Pacific/Pitcairn") ), - Country( - alpha2 = Alpha2Code("TK"), - alpha3 = Alpha3Code("TKL"), - numeric = NumericCode("772"), - name = CountryName("Tokelau"), - flag = FlagEmoji("🇹🇰"), - native = "Tokelau" + Country( + alpha2 = Alpha2Code("PR"), alpha3 = Alpha3Code("PRI"), numeric = NumericCode("630"), + name = CountryName("Puerto Rico"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDF7"), + native = "Puerto Rico", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("USD"), timezone = TimezoneId("America/Puerto_Rico") + ), + Country( + alpha2 = Alpha2Code("PS"), alpha3 = Alpha3Code("PSE"), numeric = NumericCode("275"), + name = CountryName("Palestine, State of"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDF8"), + displayName = "Palestine", native = "\u0641\u0644\u0633\u0637\u064A\u0646", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+970"), currency = CurrencyCode("ILS"), timezone = TimezoneId("Asia/Hebron") + ), + Country( + alpha2 = Alpha2Code("PT"), alpha3 = Alpha3Code("PRT"), numeric = NumericCode("620"), + name = CountryName("Portugal"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDF9"), + native = "Portugal", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+351"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Lisbon") + ), + Country( + alpha2 = Alpha2Code("PW"), alpha3 = Alpha3Code("PLW"), numeric = NumericCode("585"), + name = CountryName("Palau"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDFC"), + native = "Palau", + continent = Continent.OCEANIA, region = Region.MICRONESIA, + callingCode = CallingCode("+680"), currency = CurrencyCode("USD"), timezone = TimezoneId("Pacific/Palau") + ), + Country( + alpha2 = Alpha2Code("PY"), alpha3 = Alpha3Code("PRY"), numeric = NumericCode("600"), + name = CountryName("Paraguay"), flag = FlagEmoji("\uD83C\uDDF5\uD83C\uDDFE"), + native = "Paragua\u00ED", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+595"), currency = CurrencyCode("PYG"), timezone = TimezoneId("America/Asuncion") + ), + Country( + alpha2 = Alpha2Code("QA"), alpha3 = Alpha3Code("QAT"), numeric = NumericCode("634"), + name = CountryName("Qatar"), flag = FlagEmoji("\uD83C\uDDF6\uD83C\uDDE6"), + native = "\u0642\u0637\u0631", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+974"), currency = CurrencyCode("QAR"), timezone = TimezoneId("Asia/Qatar") + ), + Country( + alpha2 = Alpha2Code("RE"), alpha3 = Alpha3Code("REU"), numeric = NumericCode("638"), + name = CountryName("R\u00E9union"), flag = FlagEmoji("\uD83C\uDDF7\uD83C\uDDEA"), + native = "La R\u00E9union", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+262"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Indian/Reunion") + ), + Country( + alpha2 = Alpha2Code("RO"), alpha3 = Alpha3Code("ROU"), numeric = NumericCode("642"), + name = CountryName("Romania"), flag = FlagEmoji("\uD83C\uDDF7\uD83C\uDDF4"), + native = "Rom\u00E2nia", + continent = Continent.EUROPE, region = Region.EASTERN_EUROPE, + callingCode = CallingCode("+40"), currency = CurrencyCode("RON"), timezone = TimezoneId("Europe/Bucharest") + ), + Country( + alpha2 = Alpha2Code("RS"), alpha3 = Alpha3Code("SRB"), numeric = NumericCode("688"), + name = CountryName("Serbia"), flag = FlagEmoji("\uD83C\uDDF7\uD83C\uDDF8"), + native = "\u0421\u0440\u0431\u0438\u0458\u0430", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+381"), currency = CurrencyCode("RSD"), timezone = TimezoneId("Europe/Belgrade") + ), + Country( + alpha2 = Alpha2Code("RU"), alpha3 = Alpha3Code("RUS"), numeric = NumericCode("643"), + name = CountryName("Russian Federation (the)"), flag = FlagEmoji("\uD83C\uDDF7\uD83C\uDDFA"), + displayName = "Russia", native = "\u0420\u043E\u0441\u0441\u0438\u044F", + continent = Continent.EUROPE, region = Region.EASTERN_EUROPE, + callingCode = CallingCode("+7"), currency = CurrencyCode("RUB"), timezone = TimezoneId("Europe/Moscow") ), - Country( - alpha2 = Alpha2Code("TL"), - alpha3 = Alpha3Code("TLS"), - numeric = NumericCode("626"), - name = CountryName("Timor-Leste"), - flag = FlagEmoji("🇹🇱"), - native = "Timor-Leste" + Country( + alpha2 = Alpha2Code("RW"), alpha3 = Alpha3Code("RWA"), numeric = NumericCode("646"), + name = CountryName("Rwanda"), flag = FlagEmoji("\uD83C\uDDF7\uD83C\uDDFC"), + native = "Rwanda", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+250"), currency = CurrencyCode("RWF"), timezone = TimezoneId("Africa/Kigali") + ), + Country( + alpha2 = Alpha2Code("SA"), alpha3 = Alpha3Code("SAU"), numeric = NumericCode("682"), + name = CountryName("Saudi Arabia"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDE6"), + native = "\u0627\u0644\u0639\u0631\u0628\u064A\u0629 \u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+966"), currency = CurrencyCode("SAR"), timezone = TimezoneId("Asia/Riyadh") + ), + Country( + alpha2 = Alpha2Code("SB"), alpha3 = Alpha3Code("SLB"), numeric = NumericCode("090"), + name = CountryName("Solomon Islands"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDE7"), + native = "Solomon Islands", + continent = Continent.OCEANIA, region = Region.MELANESIA, + callingCode = CallingCode("+677"), currency = CurrencyCode("SBD"), timezone = TimezoneId("Pacific/Guadalcanal") ), Country( - alpha2 = Alpha2Code("TM"), - alpha3 = Alpha3Code("TKM"), - numeric = NumericCode("795"), - name = CountryName("Turkmenistan"), - flag = FlagEmoji("🇹🇲"), - native = "Туркмения" + alpha2 = Alpha2Code("SC"), alpha3 = Alpha3Code("SYC"), numeric = NumericCode("690"), + name = CountryName("Seychelles"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDE8"), + native = "Sesel", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+248"), currency = CurrencyCode("SCR"), timezone = TimezoneId("Indian/Mahe") ), Country( - alpha2 = Alpha2Code("TN"), - alpha3 = Alpha3Code("TUN"), - numeric = NumericCode("788"), - name = CountryName("Tunisia"), - flag = FlagEmoji("🇹🇳"), - native = "تونس" + alpha2 = Alpha2Code("SD"), alpha3 = Alpha3Code("SDN"), numeric = NumericCode("729"), + name = CountryName("Sudan (the)"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDE9"), + displayName = "Sudan", native = "\u0627\u0644\u0633\u0648\u062F\u0627\u0646", + continent = Continent.AFRICA, region = Region.NORTHERN_AFRICA, + callingCode = CallingCode("+249"), currency = CurrencyCode("SDG"), timezone = TimezoneId("Africa/Khartoum") ), Country( - alpha2 = Alpha2Code("TO"), - alpha3 = Alpha3Code("TON"), - numeric = NumericCode("776"), - name = CountryName("Tonga"), - flag = FlagEmoji("🇹🇴"), - native = "Tonga" - ), + alpha2 = Alpha2Code("SE"), alpha3 = Alpha3Code("SWE"), numeric = NumericCode("752"), + name = CountryName("Sweden"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDEA"), + native = "Sverige", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+46"), currency = CurrencyCode("SEK"), timezone = TimezoneId("Europe/Stockholm") + ), Country( - alpha2 = Alpha2Code("TR"), - alpha3 = Alpha3Code("TUR"), - numeric = NumericCode("792"), - name = CountryName("Turkey"), - flag = FlagEmoji("🇹🇷"), - native = "Türkiye" - ), + alpha2 = Alpha2Code("SG"), alpha3 = Alpha3Code("SGP"), numeric = NumericCode("702"), + name = CountryName("Singapore"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDEC"), + native = "Singapore", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+65"), currency = CurrencyCode("SGD"), timezone = TimezoneId("Asia/Singapore") + ), Country( - alpha2 = Alpha2Code("TT"), - alpha3 = Alpha3Code("TTO"), - numeric = NumericCode("780"), - name = CountryName("Trinidad and Tobago"), - flag = FlagEmoji("🇹🇹"), - native = "Trinidad and Tobago" - ), - Country( - alpha2 = Alpha2Code("TV"), - alpha3 = Alpha3Code("TUV"), - numeric = NumericCode("798"), - name = CountryName("Tuvalu"), - flag = FlagEmoji("🇹🇻"), - native = "Tuvalu" - ), - Country( - alpha2 = Alpha2Code("TW"), - alpha3 = Alpha3Code("TWN"), - numeric = NumericCode("158"), - name = CountryName("Taiwan (Province of China)"), - flag = FlagEmoji("🇹🇼"), - native = "台灣" - ), - Country( - alpha2 = Alpha2Code("TZ"), - alpha3 = Alpha3Code("TZA"), - numeric = NumericCode("834"), - name = CountryName("Tanzania, United Republic of"), - flag = FlagEmoji("🇹🇿"), - displayName = "Tanzania", - native = "Tanzania" - ), - Country( - alpha2 = Alpha2Code("UA"), - alpha3 = Alpha3Code("UKR"), - numeric = NumericCode("804"), - name = CountryName("Ukraine"), - flag = FlagEmoji("🇺🇦"), - native = "Україна" - ), - Country( - alpha2 = Alpha2Code("UG"), - alpha3 = Alpha3Code("UGA"), - numeric = NumericCode("800"), - name = CountryName("Uganda"), - flag = FlagEmoji("🇺🇬"), - native = "Uganda" - ), - Country( - alpha2 = Alpha2Code("UM"), - alpha3 = Alpha3Code("UMI"), - numeric = NumericCode("581"), - name = CountryName("United States Minor Outlying Islands (the)"), - flag = FlagEmoji("🇺🇲"), - displayName = "United States Minor Outlying Islands", - native = "United States Minor Outlying Islands" - ), + alpha2 = Alpha2Code("SH"), alpha3 = Alpha3Code("SHN"), numeric = NumericCode("654"), + name = CountryName("Saint Helena, Ascension and Tristan da Cunha"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDED"), + native = "Saint Helena, Ascension and Tristan da Cunha", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+290"), currency = CurrencyCode("SHP"), timezone = TimezoneId("Atlantic/St_Helena") + ), Country( - alpha2 = Alpha2Code("US"), - alpha3 = Alpha3Code("USA"), - numeric = NumericCode("840"), - name = CountryName("United States of America (the)"), - flag = FlagEmoji("🇺🇸"), - displayName = "United States", - native = "United States" + alpha2 = Alpha2Code("SI"), alpha3 = Alpha3Code("SVN"), numeric = NumericCode("705"), + name = CountryName("Slovenia"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDEE"), + native = "Slovenija", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+386"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Ljubljana") ), Country( - alpha2 = Alpha2Code("UY"), - alpha3 = Alpha3Code("URY"), - numeric = NumericCode("858"), - name = CountryName("Uruguay"), - flag = FlagEmoji("🇺🇾"), - native = "Uruguay" + alpha2 = Alpha2Code("SJ"), alpha3 = Alpha3Code("SJM"), numeric = NumericCode("744"), + name = CountryName("Svalbard and Jan Mayen"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDEF"), + native = "Svalbard og Jan Mayen", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+47"), currency = CurrencyCode("NOK"), timezone = TimezoneId("Arctic/Longyearbyen") ), Country( - alpha2 = Alpha2Code("UZ"), - alpha3 = Alpha3Code("UZB"), - numeric = NumericCode("860"), - name = CountryName("Uzbekistan"), - flag = FlagEmoji("🇺🇿"), - native = "Узбекистан" + alpha2 = Alpha2Code("SK"), alpha3 = Alpha3Code("SVK"), numeric = NumericCode("703"), + name = CountryName("Slovakia"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDF0"), + native = "Slovensko", + continent = Continent.EUROPE, region = Region.EASTERN_EUROPE, + callingCode = CallingCode("+421"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Bratislava") ), Country( - alpha2 = Alpha2Code("VA"), - alpha3 = Alpha3Code("VAT"), - numeric = NumericCode("336"), - name = CountryName("Holy See (the)"), - flag = FlagEmoji("🇻🇦"), - displayName = "Holy See", - native = "Santa Sede" - ), - Country( - alpha2 = Alpha2Code("VC"), - alpha3 = Alpha3Code("VCT"), - numeric = NumericCode("670"), - name = CountryName("Saint Vincent and the Grenadines"), - flag = FlagEmoji("🇻🇨"), - native = "Saint Vincent and the Grenadines" - ), - Country( - alpha2 = Alpha2Code("VE"), - alpha3 = Alpha3Code("VEN"), - numeric = NumericCode("862"), - name = CountryName("Venezuela (Bolivarian Republic of)"), - flag = FlagEmoji("🇻🇪"), - displayName = "Venezuela", - native = "Venezuela" - ), - Country( - alpha2 = Alpha2Code("VG"), - alpha3 = Alpha3Code("VGB"), - numeric = NumericCode("092"), - name = CountryName("Virgin Islands (British)"), - flag = FlagEmoji("🇻🇬"), - native = "British Virgin Islands" - ), - Country( - alpha2 = Alpha2Code("VI"), - alpha3 = Alpha3Code("VIR"), - numeric = NumericCode("850"), - name = CountryName("Virgin Islands (U.S.)"), - flag = FlagEmoji("🇻🇮"), - native = "United States Virgin Islands" - ), - Country( - alpha2 = Alpha2Code("VN"), - alpha3 = Alpha3Code("VNM"), - numeric = NumericCode("704"), - name = CountryName("Viet Nam"), - flag = FlagEmoji("🇻🇳"), - displayName = "Vietnam", - native = "Việt Nam" - ), - Country( - alpha2 = Alpha2Code("VU"), - alpha3 = Alpha3Code("VUT"), - numeric = NumericCode("548"), - name = CountryName("Vanuatu"), - flag = FlagEmoji("🇻🇺"), - native = "Vanuatu" - ), - Country( - alpha2 = Alpha2Code("WF"), - alpha3 = Alpha3Code("WLF"), - numeric = NumericCode("876"), - name = CountryName("Wallis and Futuna"), - flag = FlagEmoji("🇼🇫"), - native = "Wallis et Futuna" - ), - Country( - alpha2 = Alpha2Code("WS"), - alpha3 = Alpha3Code("WSM"), - numeric = NumericCode("882"), - name = CountryName("Samoa"), - flag = FlagEmoji("🇼🇸"), - native = "Samoa" - ), - Country( - alpha2 = Alpha2Code("YE"), - alpha3 = Alpha3Code("YEM"), - numeric = NumericCode("887"), - name = CountryName("Yemen"), - flag = FlagEmoji("🇾🇪"), - native = "اليَمَن" + alpha2 = Alpha2Code("SL"), alpha3 = Alpha3Code("SLE"), numeric = NumericCode("694"), + name = CountryName("Sierra Leone"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDF1"), + native = "Sierra Leone", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+232"), currency = CurrencyCode("SLE"), timezone = TimezoneId("Africa/Freetown") ), Country( - alpha2 = Alpha2Code("YT"), - alpha3 = Alpha3Code("MYT"), - numeric = NumericCode("175"), - name = CountryName("Mayotte"), - flag = FlagEmoji("🇾🇹"), - native = "Mayotte" - ), + alpha2 = Alpha2Code("SM"), alpha3 = Alpha3Code("SMR"), numeric = NumericCode("674"), + name = CountryName("San Marino"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDF2"), + native = "San Marino", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+378"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/San_Marino") + ), Country( - alpha2 = Alpha2Code("ZA"), - alpha3 = Alpha3Code("ZAF"), - numeric = NumericCode("710"), - name = CountryName("South Africa"), - flag = FlagEmoji("🇿🇦"), - native = "South Africa" - ), + alpha2 = Alpha2Code("SN"), alpha3 = Alpha3Code("SEN"), numeric = NumericCode("686"), + name = CountryName("Senegal"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDF3"), + native = "S\u00E9n\u00E9gal", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+221"), currency = CurrencyCode("XOF"), timezone = TimezoneId("Africa/Dakar") + ), Country( - alpha2 = Alpha2Code("ZM"), - alpha3 = Alpha3Code("ZMB"), - numeric = NumericCode("894"), - name = CountryName("Zambia"), - flag = FlagEmoji("🇿🇲"), - native = "Zambia" - ), + alpha2 = Alpha2Code("SO"), alpha3 = Alpha3Code("SOM"), numeric = NumericCode("706"), + name = CountryName("Somalia"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDF4"), + native = "\u0627\u0644\u0635\u0648\u0645\u0627\u0644\u200E\u200E", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+252"), currency = CurrencyCode("SOS"), timezone = TimezoneId("Africa/Mogadishu") + ), + Country( + alpha2 = Alpha2Code("SR"), alpha3 = Alpha3Code("SUR"), numeric = NumericCode("740"), + name = CountryName("Suriname"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDF7"), + native = "Suriname", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+597"), currency = CurrencyCode("SRD"), timezone = TimezoneId("America/Paramaribo") + ), + Country( + alpha2 = Alpha2Code("SS"), alpha3 = Alpha3Code("SSD"), numeric = NumericCode("728"), + name = CountryName("South Sudan"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDF8"), + native = "South Sudan", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+211"), currency = CurrencyCode("SSP"), timezone = TimezoneId("Africa/Juba") + ), + Country( + alpha2 = Alpha2Code("ST"), alpha3 = Alpha3Code("STP"), numeric = NumericCode("678"), + name = CountryName("Sao Tome and Principe"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDF9"), + displayName = "S\u00E3o Tom\u00E9 and Pr\u00EDncipe", native = "S\u00E3o Tom\u00E9 e Pr\u00EDncipe", + continent = Continent.AFRICA, region = Region.MIDDLE_AFRICA, + callingCode = CallingCode("+239"), currency = CurrencyCode("STN"), timezone = TimezoneId("Africa/Sao_Tome") + ), + Country( + alpha2 = Alpha2Code("SV"), alpha3 = Alpha3Code("SLV"), numeric = NumericCode("222"), + name = CountryName("El Salvador"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDFB"), + native = "El Salvador", + continent = Continent.NORTH_AMERICA, region = Region.CENTRAL_AMERICA, + callingCode = CallingCode("+503"), currency = CurrencyCode("USD"), timezone = TimezoneId("America/El_Salvador") + ), + Country( + alpha2 = Alpha2Code("SX"), alpha3 = Alpha3Code("SXM"), numeric = NumericCode("534"), + name = CountryName("Sint Maarten (Dutch part)"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDFD"), + native = "Sint Maarten", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("ANG"), timezone = TimezoneId("America/Lower_Princes") + ), + Country( + alpha2 = Alpha2Code("SY"), alpha3 = Alpha3Code("SYR"), numeric = NumericCode("760"), + name = CountryName("Syrian Arab Republic"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDFE"), + displayName = "Syria", native = "\u0633\u0648\u0631\u064A\u0627", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+963"), currency = CurrencyCode("SYP"), timezone = TimezoneId("Asia/Damascus") + ), + Country( + alpha2 = Alpha2Code("SZ"), alpha3 = Alpha3Code("SWZ"), numeric = NumericCode("748"), + name = CountryName("Eswatini"), flag = FlagEmoji("\uD83C\uDDF8\uD83C\uDDFF"), + native = "Eswatini", + continent = Continent.AFRICA, region = Region.SOUTHERN_AFRICA, + callingCode = CallingCode("+268"), currency = CurrencyCode("SZL"), timezone = TimezoneId("Africa/Mbabane") + ), + Country( + alpha2 = Alpha2Code("TC"), alpha3 = Alpha3Code("TCA"), numeric = NumericCode("796"), + name = CountryName("Turks and Caicos Islands (the)"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDE8"), + displayName = "Turks and Caicos Islands", native = "Turks and Caicos Islands", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("USD"), timezone = TimezoneId("America/Grand_Turk") + ), + Country( + alpha2 = Alpha2Code("TD"), alpha3 = Alpha3Code("TCD"), numeric = NumericCode("148"), + name = CountryName("Chad"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDE9"), + native = "\u062A\u0634\u0627\u062F\u200E", + continent = Continent.AFRICA, region = Region.MIDDLE_AFRICA, + callingCode = CallingCode("+235"), currency = CurrencyCode("XAF"), timezone = TimezoneId("Africa/Ndjamena") + ), + Country( + alpha2 = Alpha2Code("TF"), alpha3 = Alpha3Code("ATF"), numeric = NumericCode("260"), + name = CountryName("French Southern Territories (the)"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDEB"), + displayName = "French Southern Territories", native = "Terres australes fran\u00E7aises", + continent = Continent.ANTARCTICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+262"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Indian/Kerguelen") + ), + Country( + alpha2 = Alpha2Code("TG"), alpha3 = Alpha3Code("TGO"), numeric = NumericCode("768"), + name = CountryName("Togo"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDEC"), + native = "Togo", + continent = Continent.AFRICA, region = Region.WESTERN_AFRICA, + callingCode = CallingCode("+228"), currency = CurrencyCode("XOF"), timezone = TimezoneId("Africa/Lome") + ), + Country( + alpha2 = Alpha2Code("TH"), alpha3 = Alpha3Code("THA"), numeric = NumericCode("764"), + name = CountryName("Thailand"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDED"), + native = "\u0E1B\u0E23\u0E30\u0E40\u0E17\u0E28\u0E44\u0E17\u0E22", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+66"), currency = CurrencyCode("THB"), timezone = TimezoneId("Asia/Bangkok") + ), + Country( + alpha2 = Alpha2Code("TJ"), alpha3 = Alpha3Code("TJK"), numeric = NumericCode("762"), + name = CountryName("Tajikistan"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDEF"), + native = "\u0422\u0430\u0434\u0436\u0438\u043A\u0438\u0441\u0442\u0430\u043D", + continent = Continent.ASIA, region = Region.CENTRAL_ASIA, + callingCode = CallingCode("+992"), currency = CurrencyCode("TJS"), timezone = TimezoneId("Asia/Dushanbe") + ), + Country( + alpha2 = Alpha2Code("TK"), alpha3 = Alpha3Code("TKL"), numeric = NumericCode("772"), + name = CountryName("Tokelau"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDF0"), + native = "Tokelau", + continent = Continent.OCEANIA, region = Region.POLYNESIA, + callingCode = CallingCode("+690"), currency = CurrencyCode("NZD"), timezone = TimezoneId("Pacific/Fakaofo") + ), + Country( + alpha2 = Alpha2Code("TL"), alpha3 = Alpha3Code("TLS"), numeric = NumericCode("626"), + name = CountryName("Timor-Leste"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDF1"), + native = "Timor-Leste", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+670"), currency = CurrencyCode("USD"), timezone = TimezoneId("Asia/Dili") + ), + Country( + alpha2 = Alpha2Code("TM"), alpha3 = Alpha3Code("TKM"), numeric = NumericCode("795"), + name = CountryName("Turkmenistan"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDF2"), + native = "\u0422\u0443\u0440\u043A\u043C\u0435\u043D\u0438\u044F", + continent = Continent.ASIA, region = Region.CENTRAL_ASIA, + callingCode = CallingCode("+993"), currency = CurrencyCode("TMT"), timezone = TimezoneId("Asia/Ashgabat") + ), + Country( + alpha2 = Alpha2Code("TN"), alpha3 = Alpha3Code("TUN"), numeric = NumericCode("788"), + name = CountryName("Tunisia"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDF3"), + native = "\u062A\u0648\u0646\u0633", + continent = Continent.AFRICA, region = Region.NORTHERN_AFRICA, + callingCode = CallingCode("+216"), currency = CurrencyCode("TND"), timezone = TimezoneId("Africa/Tunis") + ), + Country( + alpha2 = Alpha2Code("TO"), alpha3 = Alpha3Code("TON"), numeric = NumericCode("776"), + name = CountryName("Tonga"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDF4"), + native = "Tonga", + continent = Continent.OCEANIA, region = Region.POLYNESIA, + callingCode = CallingCode("+676"), currency = CurrencyCode("TOP"), timezone = TimezoneId("Pacific/Tongatapu") + ), + Country( + alpha2 = Alpha2Code("TR"), alpha3 = Alpha3Code("TUR"), numeric = NumericCode("792"), + name = CountryName("T\u00FCrkiye"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDF7"), + displayName = "T\u00FCrkiye", native = "T\u00FCrkiye", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+90"), currency = CurrencyCode("TRY"), timezone = TimezoneId("Europe/Istanbul") + ), + Country( + alpha2 = Alpha2Code("TT"), alpha3 = Alpha3Code("TTO"), numeric = NumericCode("780"), + name = CountryName("Trinidad and Tobago"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDF9"), + native = "Trinidad and Tobago", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("TTD"), timezone = TimezoneId("America/Port_of_Spain") + ), + Country( + alpha2 = Alpha2Code("TV"), alpha3 = Alpha3Code("TUV"), numeric = NumericCode("798"), + name = CountryName("Tuvalu"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDFB"), + native = "Tuvalu", + continent = Continent.OCEANIA, region = Region.POLYNESIA, + callingCode = CallingCode("+688"), currency = CurrencyCode("AUD"), timezone = TimezoneId("Pacific/Funafuti") + ), + Country( + alpha2 = Alpha2Code("TW"), alpha3 = Alpha3Code("TWN"), numeric = NumericCode("158"), + name = CountryName("Taiwan (Province of China)"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDFC"), + native = "\u53F0\u7063", + continent = Continent.ASIA, region = Region.EASTERN_ASIA, + callingCode = CallingCode("+886"), currency = CurrencyCode("TWD"), timezone = TimezoneId("Asia/Taipei") + ), + Country( + alpha2 = Alpha2Code("TZ"), alpha3 = Alpha3Code("TZA"), numeric = NumericCode("834"), + name = CountryName("Tanzania, United Republic of"), flag = FlagEmoji("\uD83C\uDDF9\uD83C\uDDFF"), + displayName = "Tanzania", native = "Tanzania", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+255"), currency = CurrencyCode("TZS"), timezone = TimezoneId("Africa/Dar_es_Salaam") + ), + Country( + alpha2 = Alpha2Code("UA"), alpha3 = Alpha3Code("UKR"), numeric = NumericCode("804"), + name = CountryName("Ukraine"), flag = FlagEmoji("\uD83C\uDDFA\uD83C\uDDE6"), + native = "\u0423\u043A\u0440\u0430\u0457\u043D\u0430", + continent = Continent.EUROPE, region = Region.EASTERN_EUROPE, + callingCode = CallingCode("+380"), currency = CurrencyCode("UAH"), timezone = TimezoneId("Europe/Kyiv") + ), + Country( + alpha2 = Alpha2Code("UG"), alpha3 = Alpha3Code("UGA"), numeric = NumericCode("800"), + name = CountryName("Uganda"), flag = FlagEmoji("\uD83C\uDDFA\uD83C\uDDEC"), + native = "Uganda", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+256"), currency = CurrencyCode("UGX"), timezone = TimezoneId("Africa/Kampala") + ), + Country( + alpha2 = Alpha2Code("UM"), alpha3 = Alpha3Code("UMI"), numeric = NumericCode("581"), + name = CountryName("United States Minor Outlying Islands (the)"), flag = FlagEmoji("\uD83C\uDDFA\uD83C\uDDF2"), + displayName = "United States Minor Outlying Islands", native = "United States Minor Outlying Islands", + continent = Continent.OCEANIA, region = Region.MICRONESIA, + callingCode = CallingCode("+1"), currency = CurrencyCode("USD"), timezone = TimezoneId("Pacific/Wake") + ), + Country( + alpha2 = Alpha2Code("US"), alpha3 = Alpha3Code("USA"), numeric = NumericCode("840"), + name = CountryName("United States of America (the)"), flag = FlagEmoji("\uD83C\uDDFA\uD83C\uDDF8"), + displayName = "United States", native = "United States", + continent = Continent.NORTH_AMERICA, region = Region.NORTHERN_AMERICA, + callingCode = CallingCode("+1"), currency = CurrencyCode("USD"), timezone = TimezoneId("America/New_York") + ), + Country( + alpha2 = Alpha2Code("UY"), alpha3 = Alpha3Code("URY"), numeric = NumericCode("858"), + name = CountryName("Uruguay"), flag = FlagEmoji("\uD83C\uDDFA\uD83C\uDDFE"), + native = "Uruguay", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+598"), currency = CurrencyCode("UYU"), timezone = TimezoneId("America/Montevideo") + ), + Country( + alpha2 = Alpha2Code("UZ"), alpha3 = Alpha3Code("UZB"), numeric = NumericCode("860"), + name = CountryName("Uzbekistan"), flag = FlagEmoji("\uD83C\uDDFA\uD83C\uDDFF"), + native = "\u0423\u0437\u0431\u0435\u043A\u0438\u0441\u0442\u0430\u043D", + continent = Continent.ASIA, region = Region.CENTRAL_ASIA, + callingCode = CallingCode("+998"), currency = CurrencyCode("UZS"), timezone = TimezoneId("Asia/Tashkent") + ), + Country( + alpha2 = Alpha2Code("VA"), alpha3 = Alpha3Code("VAT"), numeric = NumericCode("336"), + name = CountryName("Holy See (the)"), flag = FlagEmoji("\uD83C\uDDFB\uD83C\uDDE6"), + displayName = "Holy See", native = "Santa Sede", + continent = Continent.EUROPE, region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+379"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Vatican") + ), + Country( + alpha2 = Alpha2Code("VC"), alpha3 = Alpha3Code("VCT"), numeric = NumericCode("670"), + name = CountryName("Saint Vincent and the Grenadines"), flag = FlagEmoji("\uD83C\uDDFB\uD83C\uDDE8"), + native = "Saint Vincent and the Grenadines", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("XCD"), timezone = TimezoneId("America/St_Vincent") + ), + Country( + alpha2 = Alpha2Code("VE"), alpha3 = Alpha3Code("VEN"), numeric = NumericCode("862"), + name = CountryName("Venezuela (Bolivarian Republic of)"), flag = FlagEmoji("\uD83C\uDDFB\uD83C\uDDEA"), + displayName = "Venezuela", native = "Venezuela", + continent = Continent.SOUTH_AMERICA, region = Region.SOUTH_AMERICA, + callingCode = CallingCode("+58"), currency = CurrencyCode("VES"), timezone = TimezoneId("America/Caracas") + ), + Country( + alpha2 = Alpha2Code("VG"), alpha3 = Alpha3Code("VGB"), numeric = NumericCode("092"), + name = CountryName("Virgin Islands (British)"), flag = FlagEmoji("\uD83C\uDDFB\uD83C\uDDEC"), + native = "British Virgin Islands", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("USD"), timezone = TimezoneId("America/Tortola") + ), + Country( + alpha2 = Alpha2Code("VI"), alpha3 = Alpha3Code("VIR"), numeric = NumericCode("850"), + name = CountryName("Virgin Islands (U.S.)"), flag = FlagEmoji("\uD83C\uDDFB\uD83C\uDDEE"), + native = "United States Virgin Islands", + continent = Continent.NORTH_AMERICA, region = Region.CARIBBEAN, + callingCode = CallingCode("+1"), currency = CurrencyCode("USD"), timezone = TimezoneId("America/Virgin") + ), + Country( + alpha2 = Alpha2Code("VN"), alpha3 = Alpha3Code("VNM"), numeric = NumericCode("704"), + name = CountryName("Viet Nam"), flag = FlagEmoji("\uD83C\uDDFB\uD83C\uDDF3"), + displayName = "Vietnam", native = "Vi\u1EC7t Nam", + continent = Continent.ASIA, region = Region.SOUTHEASTERN_ASIA, + callingCode = CallingCode("+84"), currency = CurrencyCode("VND"), timezone = TimezoneId("Asia/Ho_Chi_Minh") + ), + Country( + alpha2 = Alpha2Code("VU"), alpha3 = Alpha3Code("VUT"), numeric = NumericCode("548"), + name = CountryName("Vanuatu"), flag = FlagEmoji("\uD83C\uDDFB\uD83C\uDDFA"), + native = "Vanuatu", + continent = Continent.OCEANIA, region = Region.MELANESIA, + callingCode = CallingCode("+678"), currency = CurrencyCode("VUV"), timezone = TimezoneId("Pacific/Efate") + ), + Country( + alpha2 = Alpha2Code("WF"), alpha3 = Alpha3Code("WLF"), numeric = NumericCode("876"), + name = CountryName("Wallis and Futuna"), flag = FlagEmoji("\uD83C\uDDFC\uD83C\uDDEB"), + native = "Wallis et Futuna", + continent = Continent.OCEANIA, region = Region.POLYNESIA, + callingCode = CallingCode("+681"), currency = CurrencyCode("XPF"), timezone = TimezoneId("Pacific/Wallis") + ), + Country( + alpha2 = Alpha2Code("WS"), alpha3 = Alpha3Code("WSM"), numeric = NumericCode("882"), + name = CountryName("Samoa"), flag = FlagEmoji("\uD83C\uDDFC\uD83C\uDDF8"), + native = "Samoa", + continent = Continent.OCEANIA, region = Region.POLYNESIA, + callingCode = CallingCode("+685"), currency = CurrencyCode("WST"), timezone = TimezoneId("Pacific/Apia") + ), + Country( + alpha2 = Alpha2Code("YE"), alpha3 = Alpha3Code("YEM"), numeric = NumericCode("887"), + name = CountryName("Yemen"), flag = FlagEmoji("\uD83C\uDDFE\uD83C\uDDEA"), + native = "\u0627\u0644\u064A\u064E\u0645\u064E\u0646", + continent = Continent.ASIA, region = Region.WESTERN_ASIA, + callingCode = CallingCode("+967"), currency = CurrencyCode("YER"), timezone = TimezoneId("Asia/Aden") + ), + Country( + alpha2 = Alpha2Code("YT"), alpha3 = Alpha3Code("MYT"), numeric = NumericCode("175"), + name = CountryName("Mayotte"), flag = FlagEmoji("\uD83C\uDDFE\uD83C\uDDF9"), + native = "Mayotte", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+262"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Indian/Mayotte") + ), + Country( + alpha2 = Alpha2Code("ZA"), alpha3 = Alpha3Code("ZAF"), numeric = NumericCode("710"), + name = CountryName("South Africa"), flag = FlagEmoji("\uD83C\uDDFF\uD83C\uDDE6"), + native = "South Africa", + continent = Continent.AFRICA, region = Region.SOUTHERN_AFRICA, + callingCode = CallingCode("+27"), currency = CurrencyCode("ZAR"), timezone = TimezoneId("Africa/Johannesburg") + ), + Country( + alpha2 = Alpha2Code("ZM"), alpha3 = Alpha3Code("ZMB"), numeric = NumericCode("894"), + name = CountryName("Zambia"), flag = FlagEmoji("\uD83C\uDDFF\uD83C\uDDF2"), + native = "Zambia", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+260"), currency = CurrencyCode("ZMW"), timezone = TimezoneId("Africa/Lusaka") + ), Country( - alpha2 = Alpha2Code("ZW"), - alpha3 = Alpha3Code("ZWE"), - numeric = NumericCode("716"), - name = CountryName("Zimbabwe"), - flag = FlagEmoji("🇿🇼"), - native = "Zimbabwe" + alpha2 = Alpha2Code("ZW"), alpha3 = Alpha3Code("ZWE"), numeric = NumericCode("716"), + name = CountryName("Zimbabwe"), flag = FlagEmoji("\uD83C\uDDFF\uD83C\uDDFC"), + native = "Zimbabwe", + continent = Continent.AFRICA, region = Region.EASTERN_AFRICA, + callingCode = CallingCode("+263"), currency = CurrencyCode("ZWL"), timezone = TimezoneId("Africa/Harare") ) ) } diff --git a/countries-core/src/commonMain/kotlin/org/kimplify/countries/dsl/CountriesQuery.kt b/countries-core/src/commonMain/kotlin/org/kimplify/countries/dsl/CountriesQuery.kt index 3973c8e..f2dabc7 100644 --- a/countries-core/src/commonMain/kotlin/org/kimplify/countries/dsl/CountriesQuery.kt +++ b/countries-core/src/commonMain/kotlin/org/kimplify/countries/dsl/CountriesQuery.kt @@ -1,8 +1,13 @@ package org.kimplify.countries.dsl import org.kimplify.countries.model.* +import org.kimplify.countries.model.Continent +import org.kimplify.countries.model.Region import org.kimplify.countries.repository.CountriesRepository +@DslMarker +annotation class CountriesDsl + /** * DSL builder for querying countries with a fluent, declarative syntax. * @@ -33,10 +38,11 @@ import org.kimplify.countries.repository.CountriesRepository * * @property repository The repository to query against. */ +@CountriesDsl class CountriesQuery internal constructor( private val repository: CountriesRepository ) { - private val predicates = mutableListOf<(Country) -> Boolean>() + internal val predicates = mutableListOf<(Country) -> Boolean>() /** * Filters countries by alpha-2 code (case-insensitive). @@ -103,6 +109,7 @@ class CountriesQuery internal constructor( * @param text The text to search for in country names. */ fun nameContains(text: String) { + if (text.isBlank()) return val normalized = text.lowercase() predicates.add { country -> country.name.value.lowercase().contains(normalized) || @@ -157,6 +164,41 @@ class CountriesQuery internal constructor( } } + /** + * Filters countries by continent. + * + * @param continent The continent to filter by. + */ + fun continent(continent: Continent) { predicates.add { it.continent == continent } } + + /** + * Filters countries by UN geoscheme region. + * + * @param region The region to filter by. + */ + fun region(region: Region) { predicates.add { it.region == region } } + + /** + * Filters countries by international calling code. + * + * @param code The calling code string (e.g., "+1"). + */ + fun callingCode(code: String) { predicates.add { it.callingCode.value == code } } + + /** + * Filters countries by primary currency code (ISO 4217). + * + * @param code The currency code string (e.g., "USD"). + */ + fun currency(code: String) { predicates.add { it.currency.value == code } } + + /** + * Filters countries by primary IANA timezone identifier. + * + * @param id The timezone identifier string (e.g., "Europe/Paris"). + */ + fun timezone(id: String) { predicates.add { it.timezone.value == id } } + /** * Combines multiple predicates with OR logic. * @@ -176,12 +218,39 @@ class CountriesQuery internal constructor( * @param block The DSL block containing predicates to combine with OR. */ fun or(block: CountriesQuery.() -> Unit) { - val subQuery = CountriesQuery(repository).apply(block) + val subQuery = CountriesQuery(repository) + subQuery.block() + if (subQuery.predicates.isEmpty()) return predicates.add { country -> subQuery.predicates.any { predicate -> predicate(country) } } } + /** + * Excludes countries that match any predicate in the given block. + * + * Countries matching none of the predicates in the NOT block will be included. + * + * Example: + * ``` + * query { + * not { + * continent(Continent.EUROPE) + * } + * } + * ``` + * + * @param block The DSL block containing predicates to negate. + */ + fun not(block: CountriesQuery.() -> Unit) { + val subQuery = CountriesQuery(repository) + subQuery.block() + if (subQuery.predicates.isEmpty()) return + predicates.add { country -> + !subQuery.predicates.any { it(country) } + } + } + /** * Executes the query and returns the result. * @@ -204,7 +273,8 @@ class CountriesQuery internal constructor( */ class CountriesQueryResult internal constructor( private val countries: List -) { +) : Iterable { + override fun iterator(): Iterator = countries.iterator() /** * Returns the first matching country, or null if no matches. * diff --git a/countries-core/src/commonMain/kotlin/org/kimplify/countries/extensions/CountryExtensions.kt b/countries-core/src/commonMain/kotlin/org/kimplify/countries/extensions/CountryExtensions.kt index d1be818..c54c945 100644 --- a/countries-core/src/commonMain/kotlin/org/kimplify/countries/extensions/CountryExtensions.kt +++ b/countries-core/src/commonMain/kotlin/org/kimplify/countries/extensions/CountryExtensions.kt @@ -2,6 +2,8 @@ package org.kimplify.countries.extensions import org.kimplify.countries.Countries import org.kimplify.countries.model.* +import org.kimplify.countries.model.Continent +import org.kimplify.countries.model.Region /** * Extension functions for convenient country lookups using strings. @@ -151,3 +153,18 @@ val String.displayCountryName: String? */ val String.nativeCountryName: String? get() = toCountry()?.native + +val String.callingCode: String? + get() = this.toCountry()?.callingCode?.value + +val String.currencyCode: String? + get() = this.toCountry()?.currency?.value + +val String.continent: Continent? + get() = this.toCountry()?.continent + +val String.region: Region? + get() = this.toCountry()?.region + +val String.timezone: String? + get() = this.toCountry()?.timezone?.value diff --git a/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Continent.kt b/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Continent.kt new file mode 100644 index 0000000..1766eb4 --- /dev/null +++ b/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Continent.kt @@ -0,0 +1,5 @@ +package org.kimplify.countries.model + +enum class Continent { + AFRICA, ANTARCTICA, ASIA, EUROPE, NORTH_AMERICA, OCEANIA, SOUTH_AMERICA +} diff --git a/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Country.kt b/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Country.kt index b99d279..dfbf9c5 100644 --- a/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Country.kt +++ b/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Country.kt @@ -1,17 +1,20 @@ package org.kimplify.countries.model /** - * Represents a country with ISO 3166-1 compliant codes and basic metadata. + * Represents a country according to the ISO 3166-1 standard. * - * All country data follows the ISO 3166-1 standard for country codes and names. - * - * @property alpha2 ISO 3166-1 alpha-2 country code (2 letters). - * @property alpha3 ISO 3166-1 alpha-3 country code (3 letters). - * @property numeric ISO 3166-1 numeric country code (3 digits). - * @property name Formal ISO 3166-1 English name. - * @property flag Country flag emoji (Unicode regional indicator symbols). - * @property displayName Optional user-friendly English name (e.g., "United States" instead of "United States of America (the)"). - * @property native Optional native language name (e.g., "Deutschland" for Germany, "日本" for Japan). + * @property alpha2 ISO 3166-1 alpha-2 code (e.g., "US") + * @property alpha3 ISO 3166-1 alpha-3 code (e.g., "USA") + * @property numeric ISO 3166-1 numeric code (e.g., "840") + * @property name Official ISO English name + * @property flag Unicode flag emoji + * @property displayName Optional common/short English name + * @property native Optional native language name + * @property continent Geographic continent + * @property region UN geoscheme region + * @property callingCode International calling code (E.164) + * @property currency Primary currency code (ISO 4217) + * @property timezone Primary IANA timezone identifier */ data class Country( val alpha2: Alpha2Code, @@ -20,5 +23,10 @@ data class Country( val name: CountryName, val flag: FlagEmoji, val displayName: String? = null, - val native: String? = null + val native: String? = null, + val continent: Continent, + val region: Region, + val callingCode: CallingCode, + val currency: CurrencyCode, + val timezone: TimezoneId ) diff --git a/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/CountryCodes.kt b/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/CountryCodes.kt index 45b7701..ae30d12 100644 --- a/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/CountryCodes.kt +++ b/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/CountryCodes.kt @@ -1,5 +1,7 @@ package org.kimplify.countries.model +import de.cketti.codepoints.codePointCount +import de.cketti.codepoints.forEachCodePoint import kotlin.jvm.JvmInline /** @@ -80,8 +82,11 @@ value class CountryName(val value: String) { @JvmInline value class FlagEmoji(val value: String) { init { - require(value.length in 4..8) { - "Flag emoji must be valid Unicode regional indicator sequence, got length: ${value.length}" + require(value.codePointCount() == 2) { "Flag emoji must consist of exactly 2 codepoints" } + value.forEachCodePoint { codePoint -> + require(codePoint in 0x1F1E6..0x1F1FF) { + "Flag emoji must consist of regional indicator symbols (U+1F1E6..U+1F1FF)" + } } } } diff --git a/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/CountryMetadata.kt b/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/CountryMetadata.kt new file mode 100644 index 0000000..c059739 --- /dev/null +++ b/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/CountryMetadata.kt @@ -0,0 +1,36 @@ +package org.kimplify.countries.model + +import kotlin.jvm.JvmInline + +@JvmInline +value class CallingCode(val value: String) { + init { + require(value.matches(PATTERN)) { + "Calling code must be '+' followed by 1-4 digits (base E.164 code, e.g. \"+1\")" + } + } + companion object { + private val PATTERN = Regex("^\\+\\d{1,4}$") + } +} + +@JvmInline +value class CurrencyCode(val value: String) { + init { + require(value.matches(PATTERN)) { + "Currency code must be 3 uppercase letters (ISO 4217)" + } + } + companion object { + private val PATTERN = Regex("^[A-Z]{3}$") + } +} + +@JvmInline +value class TimezoneId(val value: String) { + init { + require(value.contains("/") || value == "UTC") { + "Timezone must be IANA format (e.g. \"America/New_York\") or \"UTC\"" + } + } +} diff --git a/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Region.kt b/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Region.kt new file mode 100644 index 0000000..7e2978f --- /dev/null +++ b/countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Region.kt @@ -0,0 +1,9 @@ +package org.kimplify.countries.model + +enum class Region { + ANTARCTICA, AUSTRALIA_AND_NEW_ZEALAND, CARIBBEAN, CENTRAL_AMERICA, CENTRAL_ASIA, + EASTERN_AFRICA, EASTERN_ASIA, EASTERN_EUROPE, MELANESIA, MICRONESIA, MIDDLE_AFRICA, + NORTHERN_AFRICA, NORTHERN_AMERICA, NORTHERN_EUROPE, POLYNESIA, SOUTH_AMERICA, + SOUTHEASTERN_ASIA, SOUTHERN_AFRICA, SOUTHERN_ASIA, SOUTHERN_EUROPE, + WESTERN_AFRICA, WESTERN_ASIA, WESTERN_EUROPE +} diff --git a/countries-core/src/commonMain/kotlin/org/kimplify/countries/repository/CountriesRepository.kt b/countries-core/src/commonMain/kotlin/org/kimplify/countries/repository/CountriesRepository.kt index 04099c7..dccf9c1 100644 --- a/countries-core/src/commonMain/kotlin/org/kimplify/countries/repository/CountriesRepository.kt +++ b/countries-core/src/commonMain/kotlin/org/kimplify/countries/repository/CountriesRepository.kt @@ -3,6 +3,10 @@ package org.kimplify.countries.repository import org.kimplify.countries.dsl.CountriesQuery import org.kimplify.countries.dsl.CountriesQueryResult import org.kimplify.countries.model.* +import org.kimplify.countries.model.CallingCode +import org.kimplify.countries.model.Continent +import org.kimplify.countries.model.CurrencyCode +import org.kimplify.countries.model.Region /** * Repository for accessing country data with efficient indexed lookups. @@ -54,6 +58,38 @@ interface CountriesRepository { */ fun searchByName(query: String): List + /** + * Returns all countries on the given continent. + * + * @param continent The continent to filter by. + * @return List of countries on the continent. + */ + fun getByContinent(continent: Continent): List + + /** + * Returns all countries in the given region. + * + * @param region The region to filter by. + * @return List of countries in the region. + */ + fun getByRegion(region: Region): List + + /** + * Returns all countries with the given international calling code. + * + * @param callingCode The calling code to filter by (e.g., CallingCode("+1")). + * @return List of countries with that calling code. + */ + fun getByCallingCode(callingCode: CallingCode): List + + /** + * Returns all countries that use the given currency. + * + * @param currencyCode The ISO 4217 currency code to filter by. + * @return List of countries using that currency. + */ + fun getByCurrency(currencyCode: CurrencyCode): List + /** * Creates a DSL query builder for complex filtering. * @@ -96,6 +132,11 @@ internal class InMemoryCountriesRepository( countries.associateBy { it.numeric } } + private val continentIndex: Map> by lazy { countries.groupBy { it.continent } } + private val regionIndex: Map> by lazy { countries.groupBy { it.region } } + private val callingCodeIndex: Map> by lazy { countries.groupBy { it.callingCode } } + private val currencyIndex: Map> by lazy { countries.groupBy { it.currency } } + override fun getAll(): List = countries override fun findByAlpha2(code: Alpha2Code): Country? = @@ -107,6 +148,11 @@ internal class InMemoryCountriesRepository( override fun findByNumeric(code: NumericCode): Country? = numericIndex[code] + override fun getByContinent(continent: Continent) = continentIndex[continent] ?: emptyList() + override fun getByRegion(region: Region) = regionIndex[region] ?: emptyList() + override fun getByCallingCode(callingCode: CallingCode) = callingCodeIndex[callingCode] ?: emptyList() + override fun getByCurrency(currencyCode: CurrencyCode) = currencyIndex[currencyCode] ?: emptyList() + override fun searchByName(query: String): List { if (query.isBlank()) return emptyList() diff --git a/countries-core/src/commonTest/kotlin/org/kimplify/countries/dsl/CountriesQueryTest.kt b/countries-core/src/commonTest/kotlin/org/kimplify/countries/dsl/CountriesQueryTest.kt index 83c3e29..8c43c45 100644 --- a/countries-core/src/commonTest/kotlin/org/kimplify/countries/dsl/CountriesQueryTest.kt +++ b/countries-core/src/commonTest/kotlin/org/kimplify/countries/dsl/CountriesQueryTest.kt @@ -7,6 +7,9 @@ import kotlin.test.assertFalse import kotlin.test.assertNotNull import kotlin.test.assertNull import kotlin.test.assertTrue +import org.kimplify.countries.model.Continent +import org.kimplify.countries.model.Country +import org.kimplify.countries.model.Region import org.kimplify.countries.repository.InMemoryCountriesRepository import org.kimplify.countries.testdata.TestCountries @@ -83,4 +86,69 @@ class CountriesQueryTest { result.first() } } + + @Test + fun continentPredicateFiltersCorrectly() { + val result = repository.query { continent(Continent.EUROPE) } + assertEquals(2, result.count()) + } + + @Test + fun regionPredicateFiltersCorrectly() { + val result = repository.query { region(Region.WESTERN_EUROPE) } + assertEquals(1, result.count()) + } + + @Test + fun callingCodePredicateFiltersCorrectly() { + val result = repository.query { callingCode("+1") } + assertEquals(2, result.count()) + } + + @Test + fun currencyPredicateFiltersCorrectly() { + val result = repository.query { currency("GBP") } + assertEquals(1, result.count()) + } + + @Test + fun timezonePredicateFiltersCorrectly() { + val result = repository.query { timezone("Europe/Paris") } + assertEquals(1, result.count()) + } + + @Test + fun queryResultIsIterable() { + val result = repository.query { continent(Continent.EUROPE) } + val collected = mutableListOf() + for (country in result) { + collected.add(country) + } + assertEquals(result.toList(), collected) + } + + @Test + fun notCombinatorExcludesMatchingCountries() { + val result = repository.query { + not { continent(Continent.EUROPE) } + } + assertTrue(result.toList().none { it.continent == Continent.EUROPE }) + assertEquals(2, result.count()) // US and Canada + } + + @Test + fun orWithEmptyBlockDoesNotFilterOutEverything() { + val result = repository.query { + or { } + } + assertEquals(4, result.count()) + } + + @Test + fun nameContainsWithBlankStringIsNoOp() { + val result = repository.query { + nameContains("") + } + assertEquals(4, result.count()) + } } diff --git a/countries-core/src/commonTest/kotlin/org/kimplify/countries/extensions/CountryExtensionsTest.kt b/countries-core/src/commonTest/kotlin/org/kimplify/countries/extensions/CountryExtensionsTest.kt index 21c6341..78d2a31 100644 --- a/countries-core/src/commonTest/kotlin/org/kimplify/countries/extensions/CountryExtensionsTest.kt +++ b/countries-core/src/commonTest/kotlin/org/kimplify/countries/extensions/CountryExtensionsTest.kt @@ -1,5 +1,7 @@ package org.kimplify.countries.extensions +import org.kimplify.countries.model.Continent +import org.kimplify.countries.model.Region import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith @@ -40,4 +42,19 @@ class CountryExtensionsTest { assertEquals("US", "USA".toAlpha2) assertEquals("USA", "840".toAlpha3) } + + @Test + fun newFieldExtensionsExposeCountryData() { + assertEquals("+1", "US".callingCode) + assertEquals("USD", "US".currencyCode) + assertEquals(Continent.NORTH_AMERICA, "US".continent) + assertEquals(Region.NORTHERN_AMERICA, "US".region) + assertEquals("America/New_York", "US".timezone) + + assertNull("ZZ".callingCode) + assertNull("ZZ".currencyCode) + assertNull("ZZ".continent) + assertNull("ZZ".region) + assertNull("ZZ".timezone) + } } diff --git a/countries-core/src/commonTest/kotlin/org/kimplify/countries/model/CountryCodesValidationTest.kt b/countries-core/src/commonTest/kotlin/org/kimplify/countries/model/CountryCodesValidationTest.kt index 3c40bb9..eecdba6 100644 --- a/countries-core/src/commonTest/kotlin/org/kimplify/countries/model/CountryCodesValidationTest.kt +++ b/countries-core/src/commonTest/kotlin/org/kimplify/countries/model/CountryCodesValidationTest.kt @@ -59,15 +59,19 @@ class CountryCodesValidationTest { } @Test - fun flagEmojiEnforcesValidLength() { - val emoji = FlagEmoji("\uD83C\uDDFA\uD83C\uDDF8") - assertEquals("\uD83C\uDDFA\uD83C\uDDF8", emoji.value) + fun flagEmojiRequiresExactlyTwoRegionalIndicatorCodepoints() { + // Valid flag emojis (2 regional indicator symbols) + FlagEmoji("🇺🇸") // US + FlagEmoji("🇬🇧") // GB + FlagEmoji("🇯🇵") // JP - assertFailsWith { - FlagEmoji("") - } - assertFailsWith { - FlagEmoji("A") - } + // Reject ASCII strings that happen to have length 4 + assertFailsWith { FlagEmoji("ABCD") } + // Reject single regional indicator + assertFailsWith { FlagEmoji("🇺") } + // Reject empty + assertFailsWith { FlagEmoji("") } + // Reject non-flag emoji + assertFailsWith { FlagEmoji("😀😀") } } } diff --git a/countries-core/src/commonTest/kotlin/org/kimplify/countries/model/CountryMetadataValidationTest.kt b/countries-core/src/commonTest/kotlin/org/kimplify/countries/model/CountryMetadataValidationTest.kt new file mode 100644 index 0000000..293675d --- /dev/null +++ b/countries-core/src/commonTest/kotlin/org/kimplify/countries/model/CountryMetadataValidationTest.kt @@ -0,0 +1,42 @@ +package org.kimplify.countries.model + +import kotlin.test.Test +import kotlin.test.assertFailsWith + +class CountryMetadataValidationTest { + @Test + fun callingCodeRequiresPlusPrefixAndDigits() { + CallingCode("+1") + CallingCode("+44") + CallingCode("+380") + CallingCode("+1868") + assertFailsWith { CallingCode("1") } + assertFailsWith { CallingCode("+") } + assertFailsWith { CallingCode("+12345") } + assertFailsWith { CallingCode("") } + assertFailsWith { CallingCode("+abc") } + } + + @Test + fun currencyCodeRequiresThreeUppercaseLetters() { + CurrencyCode("USD") + CurrencyCode("EUR") + CurrencyCode("JPY") + assertFailsWith { CurrencyCode("usd") } + assertFailsWith { CurrencyCode("US") } + assertFailsWith { CurrencyCode("USDX") } + assertFailsWith { CurrencyCode("") } + assertFailsWith { CurrencyCode("123") } + } + + @Test + fun timezoneIdRequiresIanaFormatOrUtc() { + TimezoneId("America/New_York") + TimezoneId("Europe/London") + TimezoneId("UTC") + TimezoneId("Asia/Tokyo") + assertFailsWith { TimezoneId("") } + assertFailsWith { TimezoneId("EST") } + assertFailsWith { TimezoneId("NewYork") } + } +} diff --git a/countries-core/src/commonTest/kotlin/org/kimplify/countries/repository/CountriesRepositoryTest.kt b/countries-core/src/commonTest/kotlin/org/kimplify/countries/repository/CountriesRepositoryTest.kt index 33bb3e5..c0bf97f 100644 --- a/countries-core/src/commonTest/kotlin/org/kimplify/countries/repository/CountriesRepositoryTest.kt +++ b/countries-core/src/commonTest/kotlin/org/kimplify/countries/repository/CountriesRepositoryTest.kt @@ -6,7 +6,11 @@ import kotlin.test.assertNull import kotlin.test.assertTrue import org.kimplify.countries.model.Alpha2Code import org.kimplify.countries.model.Alpha3Code +import org.kimplify.countries.model.CallingCode +import org.kimplify.countries.model.Continent +import org.kimplify.countries.model.CurrencyCode import org.kimplify.countries.model.NumericCode +import org.kimplify.countries.model.Region import org.kimplify.countries.testdata.TestCountries class CountriesRepositoryTest { @@ -51,4 +55,30 @@ class CountriesRepositoryTest { fun searchByNameReturnsEmptyForBlankQueries() { assertTrue(repository.searchByName(" ").isEmpty()) } + + @Test + fun canFindCountriesByContinent() { + val result = repository.getByContinent(Continent.NORTH_AMERICA) + assertEquals(2, result.size) + assertTrue(result.all { it.continent == Continent.NORTH_AMERICA }) + } + + @Test + fun canFindCountriesByRegion() { + val result = repository.getByRegion(Region.NORTHERN_AMERICA) + assertEquals(2, result.size) + } + + @Test + fun canFindCountriesByCallingCode() { + val result = repository.getByCallingCode(CallingCode("+1")) + assertEquals(2, result.size) + } + + @Test + fun canFindCountriesByCurrency() { + val result = repository.getByCurrency(CurrencyCode("EUR")) + assertEquals(1, result.size) + assertEquals("FR", result.first().alpha2.value) + } } diff --git a/countries-core/src/commonTest/kotlin/org/kimplify/countries/testdata/TestCountries.kt b/countries-core/src/commonTest/kotlin/org/kimplify/countries/testdata/TestCountries.kt index 3271da0..7f4abf2 100644 --- a/countries-core/src/commonTest/kotlin/org/kimplify/countries/testdata/TestCountries.kt +++ b/countries-core/src/commonTest/kotlin/org/kimplify/countries/testdata/TestCountries.kt @@ -2,46 +2,45 @@ package org.kimplify.countries.testdata import org.kimplify.countries.model.Alpha2Code import org.kimplify.countries.model.Alpha3Code +import org.kimplify.countries.model.CallingCode +import org.kimplify.countries.model.Continent import org.kimplify.countries.model.Country import org.kimplify.countries.model.CountryName +import org.kimplify.countries.model.CurrencyCode import org.kimplify.countries.model.FlagEmoji import org.kimplify.countries.model.NumericCode +import org.kimplify.countries.model.Region +import org.kimplify.countries.model.TimezoneId internal object TestCountries { val unitedStates = Country( - alpha2 = Alpha2Code("US"), - alpha3 = Alpha3Code("USA"), - numeric = NumericCode("840"), - name = CountryName("United States of America (the)"), - flag = FlagEmoji("\uD83C\uDDFA\uD83C\uDDF8"), - displayName = "United States", - native = "United States" + alpha2 = Alpha2Code("US"), alpha3 = Alpha3Code("USA"), numeric = NumericCode("840"), + name = CountryName("United States of America (the)"), flag = FlagEmoji("\uD83C\uDDFA\uD83C\uDDF8"), + displayName = "United States", native = "United States", + continent = Continent.NORTH_AMERICA, region = Region.NORTHERN_AMERICA, + callingCode = CallingCode("+1"), currency = CurrencyCode("USD"), timezone = TimezoneId("America/New_York") ) val unitedKingdom = Country( - alpha2 = Alpha2Code("GB"), - alpha3 = Alpha3Code("GBR"), - numeric = NumericCode("826"), - name = CountryName("United Kingdom of Great Britain and Northern Ireland (the)"), - flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDE7"), - displayName = "United Kingdom", - native = "United Kingdom" + alpha2 = Alpha2Code("GB"), alpha3 = Alpha3Code("GBR"), numeric = NumericCode("826"), + name = CountryName("United Kingdom of Great Britain and Northern Ireland (the)"), flag = FlagEmoji("\uD83C\uDDEC\uD83C\uDDE7"), + displayName = "United Kingdom", native = "United Kingdom", + continent = Continent.EUROPE, region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+44"), currency = CurrencyCode("GBP"), timezone = TimezoneId("Europe/London") ) val canada = Country( - alpha2 = Alpha2Code("CA"), - alpha3 = Alpha3Code("CAN"), - numeric = NumericCode("124"), - name = CountryName("Canada"), - flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDE6") + alpha2 = Alpha2Code("CA"), alpha3 = Alpha3Code("CAN"), numeric = NumericCode("124"), + name = CountryName("Canada"), flag = FlagEmoji("\uD83C\uDDE8\uD83C\uDDE6"), + continent = Continent.NORTH_AMERICA, region = Region.NORTHERN_AMERICA, + callingCode = CallingCode("+1"), currency = CurrencyCode("CAD"), timezone = TimezoneId("America/Toronto") ) val france = Country( - alpha2 = Alpha2Code("FR"), - alpha3 = Alpha3Code("FRA"), - numeric = NumericCode("250"), - name = CountryName("France"), - flag = FlagEmoji("\uD83C\uDDEB\uD83C\uDDF7") + alpha2 = Alpha2Code("FR"), alpha3 = Alpha3Code("FRA"), numeric = NumericCode("250"), + name = CountryName("France"), flag = FlagEmoji("\uD83C\uDDEB\uD83C\uDDF7"), native = "France", + continent = Continent.EUROPE, region = Region.WESTERN_EUROPE, + callingCode = CallingCode("+33"), currency = CurrencyCode("EUR"), timezone = TimezoneId("Europe/Paris") ) val sampleCountries = listOf( diff --git a/countries-i18n/README.md b/countries-i18n/README.md index cbaf0c8..8b65043 100644 --- a/countries-i18n/README.md +++ b/countries-i18n/README.md @@ -1,12 +1,13 @@ # KCountries I18n -Internationalization module for KCountries library providing country name translations in 6 major languages. +Internationalization module for KCountries library providing country name translations in 13 languages. ## Features -- **6 Languages**: English, Spanish, French, German, Arabic, Chinese, Russian +- **14 Languages**: EN, ES, FR, DE, AR, ZH, RU, JA, PT, HI, KO, IT, TR, ID - **Type-Safe Locale**: ISO 639-1 validated locale value class -- **250 Countries**: Comprehensive translation coverage (245+ for all languages) +- **249 Countries**: Complete translation coverage for all languages +- **Smart Normalization**: Accepts `"en-US"`, `"PT_BR"`, `"ES"` — extracts the language automatically - **Multiplatform**: Works on Android, iOS, JVM, JS, and WASM - **Zero Dependencies**: Standalone module with static data - **Fast**: O(1) lookup with in-memory maps @@ -15,8 +16,8 @@ Internationalization module for KCountries library providing country name transl ```kotlin dependencies { - implementation("org.kimplify:countries-core:0.1.0") - implementation("org.kimplify:countries-i18n:0.1.0") + implementation("org.kimplify:countries-core:0.1.1") + implementation("org.kimplify:countries-i18n:0.1.1") } ``` @@ -44,8 +45,11 @@ country.getLocalizedName(Locale.RU) // "Соединенные Штаты" ### Using String Locale Codes ```kotlin -country.getLocalizedName("es") // "Estados Unidos" -country.getLocalizedName() // "United States" (defaults to English) +country.getLocalizedName("es") // "Estados Unidos" +country.getLocalizedName("es-MX") // "Estados Unidos" (normalized to "es") +country.getLocalizedName("PT_BR") // "Estados Unidos da América" (normalized to "pt") +country.getLocalizedName("EN") // "United States" (normalized to "en") +country.getLocalizedName() // "United States" (defaults to English) ``` ### Get All Translations @@ -72,7 +76,7 @@ translations.forEach { (locale, name) -> import org.kimplify.countries.i18n.CountryTranslations CountryTranslations.supportedLocales -// [Locale.EN, Locale.ES, Locale.FR, Locale.DE, Locale.AR, Locale.ZH, Locale.RU] +// [ES, FR, DE, AR, ZH, RU, JA, PT, HI, KO, IT, TR, ID] ``` ### Type-Safe Locale @@ -88,13 +92,13 @@ val invalidCase = Locale("EN") // ❌ Exception: must be lowercase Predefined constants for convenience: ```kotlin -Locale.EN // English -Locale.ES // Spanish -Locale.FR // French -Locale.DE // German -Locale.AR // Arabic -Locale.ZH // Chinese -Locale.RU // Russian +Locale.EN // English Locale.AR // Arabic +Locale.ES // Spanish Locale.ZH // Chinese +Locale.FR // French Locale.RU // Russian +Locale.DE // German Locale.JA // Japanese +Locale.PT // Portuguese Locale.KO // Korean +Locale.HI // Hindi Locale.IT // Italian +Locale.TR // Turkish Locale.ID // Indonesian ``` ## Fallback Chain @@ -117,13 +121,20 @@ country.getLocalizedName(Locale.EN) // "United Kingdom" (display name) | Language | Code | Countries | Script | |----------|------|-----------|--------| -| English | en | 249 | Latin | -| Spanish | es | 250 | Latin | -| French | fr | 250 | Latin | -| German | de | 250 | Latin | -| Arabic | ar | 250 | Arabic (RTL) | -| Chinese | zh | 245 | Chinese | -| Russian | ru | 250 | Cyrillic | +| English | en | 249 | Latin (fallback) | +| Spanish | es | 249 | Latin | +| French | fr | 249 | Latin | +| German | de | 249 | Latin | +| Italian | it | 249 | Latin | +| Portuguese | pt | 249 | Latin | +| Turkish | tr | 249 | Latin | +| Indonesian | id | 249 | Latin | +| Arabic | ar | 249 | Arabic (RTL) | +| Chinese | zh | 249 | CJK | +| Japanese | ja | 249 | CJK | +| Korean | ko | 249 | Hangul | +| Hindi | hi | 249 | Devanagari | +| Russian | ru | 249 | Cyrillic | ## Example: Compose UI with Locale Switcher diff --git a/countries-i18n/build.gradle.kts b/countries-i18n/build.gradle.kts index b522727..95dbe95 100644 --- a/countries-i18n/build.gradle.kts +++ b/countries-i18n/build.gradle.kts @@ -55,10 +55,10 @@ kotlin { android { namespace = "org.kimplify.countriesI18n" - compileSdk = 35 + compileSdk = libs.versions.android.compileSdk.get().toInt() defaultConfig { - minSdk = 21 + minSdk = libs.versions.android.minSdk.get().toInt() } } diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/CountryTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/CountryTranslations.kt index 5a4518a..d4973ac 100644 --- a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/CountryTranslations.kt +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/CountryTranslations.kt @@ -4,13 +4,20 @@ import org.kimplify.countries.i18n.data.* object CountryTranslations { - private val translationMaps = mapOf( + private val translationMaps: Map> = mapOf( Locale.ES to esTranslations, Locale.FR to frTranslations, Locale.DE to deTranslations, Locale.AR to arTranslations, Locale.ZH to zhTranslations, - Locale.RU to ruTranslations + Locale.RU to ruTranslations, + Locale.JA to jaTranslations, + Locale.PT to ptTranslations, + Locale.HI to hiTranslations, + Locale.KO to koTranslations, + Locale.IT to itTranslations, + Locale.TR to trTranslations, + Locale.ID to idTranslations ) fun getTranslation(alpha2: String, locale: Locale): String? { @@ -18,7 +25,13 @@ object CountryTranslations { } fun getTranslation(alpha2: String, localeCode: String): String? { - return getTranslation(alpha2, Locale(localeCode)) + val normalized = localeCode.split('-', '_').firstOrNull()?.lowercase() ?: return null + if (normalized.length != 2) return null + return try { + getTranslation(alpha2, Locale(normalized)) + } catch (_: IllegalArgumentException) { + null + } } fun getAllTranslations(alpha2: String): Map { diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/Locale.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/Locale.kt index 24ed15b..9c24f86 100644 --- a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/Locale.kt +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/Locale.kt @@ -1,6 +1,8 @@ package org.kimplify.countries.i18n -@kotlin.jvm.JvmInline +import kotlin.jvm.JvmInline + +@JvmInline value class Locale(val code: String) { init { require(code.length == 2 && code.all { it.isLowerCase() && it.isLetter() }) { @@ -19,5 +21,9 @@ value class Locale(val code: String) { val JA = Locale("ja") val PT = Locale("pt") val HI = Locale("hi") + val KO = Locale("ko") + val IT = Locale("it") + val TR = Locale("tr") + val ID = Locale("id") } } diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ArabicTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ArabicTranslations.kt index 00f3424..d1a040b 100644 --- a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ArabicTranslations.kt +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ArabicTranslations.kt @@ -245,7 +245,6 @@ internal val arTranslations = mapOf( "VU" to "فانواتو", "WF" to "واليس وفوتونا", "WS" to "ساموا", - "XK" to "كوسوفو", "YE" to "اليمن", "YT" to "مايوت", "ZA" to "جنوب أفريقيا", diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ChineseTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ChineseTranslations.kt index 770a7c6..420f3dd 100644 --- a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ChineseTranslations.kt +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ChineseTranslations.kt @@ -48,6 +48,7 @@ internal val zhTranslations = mapOf( "CK" to "库克群岛", "CL" to "智利", "CM" to "喀麦隆", + "CN" to "中国", "CO" to "哥伦比亚", "CR" to "哥斯达黎加", "CU" to "古巴", @@ -94,6 +95,7 @@ internal val zhTranslations = mapOf( "GU" to "关岛", "GW" to "几内亚比绍", "GY" to "圭亚那", + "HK" to "中国香港特别行政区", "HM" to "赫德岛和麦当劳群岛", "HN" to "洪都拉斯", "HR" to "克罗地亚", @@ -146,6 +148,7 @@ internal val zhTranslations = mapOf( "ML" to "马里", "MM" to "缅甸", "MN" to "蒙古", + "MO" to "中国澳门特别行政区", "MP" to "北马里亚纳群岛", "MQ" to "马提尼克", "MR" to "毛里塔尼亚", @@ -195,6 +198,7 @@ internal val zhTranslations = mapOf( "SC" to "塞舌尔", "SD" to "苏丹", "SE" to "瑞典", + "SG" to "新加坡", "SH" to "圣赫勒拿、阿森松和特里斯坦-达库尼亚", "SI" to "斯洛文尼亚", "SJ" to "斯瓦尔巴特", @@ -224,6 +228,7 @@ internal val zhTranslations = mapOf( "TR" to "土耳其", "TT" to "特立尼达和多巴哥", "TV" to "图瓦卢", + "TW" to "中国台湾省", "TZ" to "坦桑尼亚", "UA" to "乌克兰", "UG" to "乌干达", @@ -240,7 +245,6 @@ internal val zhTranslations = mapOf( "VU" to "瓦努阿图", "WF" to "瓦利斯和富图纳群岛", "WS" to "萨摩亚", - "XK" to "科索沃", "YE" to "也门", "YT" to "马约特", "ZA" to "南非", diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/FrenchTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/FrenchTranslations.kt index f49ef79..343f6b7 100644 --- a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/FrenchTranslations.kt +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/FrenchTranslations.kt @@ -245,7 +245,6 @@ internal val frTranslations = mapOf( "VU" to "Vanuatu", "WF" to "Wallis-et-Futuna", "WS" to "Samoa", - "XK" to "Kosovo", "YE" to "Yémen", "YT" to "Mayotte", "ZA" to "Afrique du Sud", diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/GermanTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/GermanTranslations.kt index 5504461..7f11d47 100644 --- a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/GermanTranslations.kt +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/GermanTranslations.kt @@ -245,7 +245,6 @@ internal val deTranslations = mapOf( "VU" to "Vanuatu", "WF" to "Wallis und Futuna", "WS" to "Samoa", - "XK" to "Kosovo", "YE" to "Jemen", "YT" to "Mayotte", "ZA" to "Südafrika", diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/HindiTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/HindiTranslations.kt new file mode 100644 index 0000000..820f133 --- /dev/null +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/HindiTranslations.kt @@ -0,0 +1,253 @@ +package org.kimplify.countries.i18n.data + +internal val hiTranslations = mapOf( + "AD" to "अंडोरा", + "AE" to "संयुक्त अरब अमीरात", + "AF" to "अफ़गानिस्तान", + "AG" to "एंटीगुआ और बारबूडा", + "AI" to "एंगुइला", + "AL" to "अल्बानिया", + "AM" to "आर्मेनिया", + "AO" to "अंगोला", + "AQ" to "अंटार्कटिका", + "AR" to "अर्जेंटीना", + "AS" to "अमेरिकी समोआ", + "AT" to "ऑस्ट्रिया", + "AU" to "ऑस्ट्रेलिया", + "AW" to "अरूबा", + "AX" to "ऑलैंड द्वीपसमूह", + "AZ" to "अज़रबैजान", + "BA" to "बोस्निया और हर्ज़ेगोविना", + "BB" to "बारबाडोस", + "BD" to "बांग्लादेश", + "BE" to "बेल्जियम", + "BF" to "बुर्किना फासो", + "BG" to "बुल्गारिया", + "BH" to "बहरीन", + "BI" to "बुरुंडी", + "BJ" to "बेनिन", + "BL" to "सेंट बार्थेलेमी", + "BM" to "बरमूडा", + "BN" to "ब्रुनेई", + "BO" to "बोलीविया", + "BQ" to "कैरेबियन नीदरलैंड", + "BR" to "ब्राज़ील", + "BS" to "बहामास", + "BT" to "भूटान", + "BV" to "बूवे द्वीप", + "BW" to "बोत्सवाना", + "BY" to "बेलारूस", + "BZ" to "बेलीज़", + "CA" to "कनाडा", + "CC" to "कोकोस (कीलिंग) द्वीपसमूह", + "CD" to "कांगो लोकतांत्रिक गणराज्य", + "CF" to "मध्य अफ़्रीकी गणराज्य", + "CG" to "कांगो गणराज्य", + "CH" to "स्विट्ज़रलैंड", + "CI" to "कोत दिव्वार", + "CK" to "कुक द्वीपसमूह", + "CL" to "चिली", + "CM" to "कैमरून", + "CN" to "चीन", + "CO" to "कोलम्बिया", + "CR" to "कोस्टा रिका", + "CU" to "क्यूबा", + "CV" to "केप वर्डे", + "CW" to "कुराकाओ", + "CX" to "क्रिसमस द्वीप", + "CY" to "साइप्रस", + "CZ" to "चेकिया", + "DE" to "जर्मनी", + "DJ" to "जिबूती", + "DK" to "डेनमार्क", + "DM" to "डोमिनिका", + "DO" to "डोमिनिकन गणराज्य", + "DZ" to "अल्जीरिया", + "EC" to "इक्वाडोर", + "EE" to "एस्टोनिया", + "EG" to "मिस्र", + "EH" to "पश्चिमी सहारा", + "ER" to "इरिट्रिया", + "ES" to "स्पेन", + "ET" to "इथियोपिया", + "FI" to "फ़िनलैंड", + "FJ" to "फ़िजी", + "FK" to "फ़ॉकलैंड द्वीपसमूह", + "FM" to "माइक्रोनेशिया", + "FO" to "फ़ैरो द्वीपसमूह", + "FR" to "फ़्रांस", + "GA" to "गैबॉन", + "GB" to "यूनाइटेड किंगडम", + "GD" to "ग्रेनाडा", + "GE" to "जॉर्जिया", + "GF" to "फ़्रेंच गयाना", + "GG" to "गर्नसी", + "GH" to "घाना", + "GI" to "जिब्राल्टर", + "GL" to "ग्रीनलैंड", + "GM" to "गाम्बिया", + "GN" to "गिनी", + "GP" to "ग्वाडेलूप", + "GQ" to "इक्वेटोरियल गिनी", + "GR" to "यूनान", + "GS" to "दक्षिण जॉर्जिया और दक्षिण सैंडविच द्वीपसमूह", + "GT" to "ग्वाटेमाला", + "GU" to "गुआम", + "GW" to "गिनी-बिसाउ", + "GY" to "गयाना", + "HK" to "हांगकांग", + "HM" to "हर्ड द्वीप और मैकडॉनल्ड द्वीपसमूह", + "HN" to "होंडुरास", + "HR" to "क्रोएशिया", + "HT" to "हैती", + "HU" to "हंगरी", + "ID" to "इंडोनेशिया", + "IE" to "आयरलैंड", + "IL" to "इज़राइल", + "IM" to "आइल ऑफ़ मैन", + "IN" to "भारत", + "IO" to "ब्रिटिश हिंद महासागर क्षेत्र", + "IQ" to "इराक", + "IR" to "ईरान", + "IS" to "आइसलैंड", + "IT" to "इटली", + "JE" to "जर्सी", + "JM" to "जमैका", + "JO" to "जॉर्डन", + "JP" to "जापान", + "KE" to "केन्या", + "KG" to "किर्गिज़स्तान", + "KH" to "कंबोडिया", + "KI" to "किरिबाती", + "KM" to "कोमोरोस", + "KN" to "सेंट किट्स और नेविस", + "KP" to "उत्तर कोरिया", + "KR" to "दक्षिण कोरिया", + "KW" to "कुवैत", + "KY" to "केमैन द्वीपसमूह", + "KZ" to "कज़ाख़स्तान", + "LA" to "लाओस", + "LB" to "लेबनान", + "LC" to "सेंट लूसिया", + "LI" to "लिख्टेंस्टाइन", + "LK" to "श्रीलंका", + "LR" to "लाइबेरिया", + "LS" to "लेसोथो", + "LT" to "लिथुआनिया", + "LU" to "लक्ज़मबर्ग", + "LV" to "लातविया", + "LY" to "लीबिया", + "MA" to "मोरक्को", + "MC" to "मोनाको", + "MD" to "मॉल्डोवा", + "ME" to "मोंटेनेग्रो", + "MF" to "सेंट मार्टिन", + "MG" to "मेडागास्कर", + "MH" to "मार्शल द्वीपसमूह", + "MK" to "उत्तरी मैसेडोनिया", + "ML" to "माली", + "MM" to "म्यांमार", + "MN" to "मंगोलिया", + "MO" to "मकाऊ", + "MP" to "उत्तरी मारियाना द्वीपसमूह", + "MQ" to "मार्टीनिक", + "MR" to "मॉरिटानिया", + "MS" to "मॉन्टसेरात", + "MT" to "माल्टा", + "MU" to "मॉरीशस", + "MV" to "मालदीव", + "MW" to "मलावी", + "MX" to "मेक्सिको", + "MY" to "मलेशिया", + "MZ" to "मोज़ाम्बीक", + "NA" to "नामीबिया", + "NC" to "नया कैलेडोनिया", + "NE" to "नाइजर", + "NF" to "नॉरफ़ॉक द्वीप", + "NG" to "नाइजीरिया", + "NI" to "निकारागुआ", + "NL" to "नीदरलैंड", + "NO" to "नॉर्वे", + "NP" to "नेपाल", + "NR" to "नाउरू", + "NU" to "नीऊए", + "NZ" to "न्यूज़ीलैंड", + "OM" to "ओमान", + "PA" to "पनामा", + "PE" to "पेरू", + "PF" to "फ़्रेंच पोलिनेशिया", + "PG" to "पापुआ न्यू गिनी", + "PH" to "फ़िलीपींस", + "PK" to "पाकिस्तान", + "PL" to "पोलैंड", + "PM" to "सेंट पिएरे और मिक्वेलॉन", + "PN" to "पिटकेयर्न द्वीपसमूह", + "PR" to "प्यूर्टो रिको", + "PS" to "फ़िलिस्तीन", + "PT" to "पुर्तगाल", + "PW" to "पलाऊ", + "PY" to "पराग्वे", + "QA" to "क़तर", + "RE" to "रीयूनियन", + "RO" to "रोमानिया", + "RS" to "सर्बिया", + "RU" to "रूस", + "RW" to "रवांडा", + "SA" to "सऊदी अरब", + "SB" to "सोलोमन द्वीपसमूह", + "SC" to "सेशेल्स", + "SD" to "सूडान", + "SE" to "स्वीडन", + "SG" to "सिंगापुर", + "SH" to "सेंट हेलेना, असेंशन और त्रिस्तान दा कुन्हा", + "SI" to "स्लोवेनिया", + "SJ" to "स्वालबार्ड और यान मायेन", + "SK" to "स्लोवाकिया", + "SL" to "सिएरा लियोन", + "SM" to "सैन मरीनो", + "SN" to "सेनेगल", + "SO" to "सोमालिया", + "SR" to "सूरीनाम", + "SS" to "दक्षिण सूडान", + "ST" to "साओ टोमे और प्रिंसिपे", + "SV" to "अल सल्वाडोर", + "SX" to "सिंट मार्टेन", + "SY" to "सीरिया", + "SZ" to "एस्वातीनी", + "TC" to "तुर्क और कैकोस द्वीपसमूह", + "TD" to "चाड", + "TF" to "फ़्रांसीसी दक्षिणी क्षेत्र", + "TG" to "टोगो", + "TH" to "थाईलैंड", + "TJ" to "ताजिकिस्तान", + "TK" to "टोकेलाउ", + "TL" to "तिमोर-लेस्ते", + "TM" to "तुर्कमेनिस्तान", + "TN" to "ट्यूनीशिया", + "TO" to "टोंगा", + "TR" to "तुर्किये", + "TT" to "त्रिनिदाद और टोबैगो", + "TV" to "तुवालू", + "TW" to "ताइवान", + "TZ" to "तंज़ानिया", + "UA" to "यूक्रेन", + "UG" to "युगांडा", + "UM" to "संयुक्त राज्य के छोटे बाहरी द्वीपसमूह", + "US" to "संयुक्त राज्य अमेरिका", + "UY" to "उरुग्वे", + "UZ" to "उज़्बेकिस्तान", + "VA" to "वेटिकन सिटी", + "VC" to "सेंट विंसेंट और ग्रेनाडाइंस", + "VE" to "वेनेज़ुएला", + "VG" to "ब्रिटिश वर्जिन द्वीपसमूह", + "VI" to "अमेरिकी वर्जिन द्वीपसमूह", + "VN" to "वियतनाम", + "VU" to "वानूआतू", + "WF" to "वालिस और फ़्यूचूना", + "WS" to "समोआ", + "YE" to "यमन", + "YT" to "मायोट", + "ZA" to "दक्षिण अफ़्रीका", + "ZM" to "ज़ाम्बिया", + "ZW" to "ज़िम्बाब्वे", +) diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/IndonesianTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/IndonesianTranslations.kt new file mode 100644 index 0000000..40a6506 --- /dev/null +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/IndonesianTranslations.kt @@ -0,0 +1,253 @@ +package org.kimplify.countries.i18n.data + +internal val idTranslations = mapOf( + "AD" to "Andorra", + "AE" to "Uni Emirat Arab", + "AF" to "Afganistan", + "AG" to "Antigua dan Barbuda", + "AI" to "Anguilla", + "AL" to "Albania", + "AM" to "Armenia", + "AO" to "Angola", + "AQ" to "Antarktika", + "AR" to "Argentina", + "AS" to "Samoa Amerika", + "AT" to "Austria", + "AU" to "Australia", + "AW" to "Aruba", + "AX" to "Kepulauan Aland", + "AZ" to "Azerbaijan", + "BA" to "Bosnia dan Herzegovina", + "BB" to "Barbados", + "BD" to "Bangladesh", + "BE" to "Belgia", + "BF" to "Burkina Faso", + "BG" to "Bulgaria", + "BH" to "Bahrain", + "BI" to "Burundi", + "BJ" to "Benin", + "BL" to "Saint Barthelemy", + "BM" to "Bermuda", + "BN" to "Brunei", + "BO" to "Bolivia", + "BQ" to "Karibia Belanda", + "BR" to "Brasil", + "BS" to "Bahama", + "BT" to "Bhutan", + "BV" to "Pulau Bouvet", + "BW" to "Botswana", + "BY" to "Belarus", + "BZ" to "Belize", + "CA" to "Kanada", + "CC" to "Kepulauan Cocos (Keeling)", + "CD" to "Republik Demokratik Kongo", + "CF" to "Republik Afrika Tengah", + "CG" to "Kongo", + "CH" to "Swiss", + "CI" to "Pantai Gading", + "CK" to "Kepulauan Cook", + "CL" to "Chili", + "CM" to "Kamerun", + "CN" to "Tiongkok", + "CO" to "Kolombia", + "CR" to "Kosta Rika", + "CU" to "Kuba", + "CV" to "Tanjung Verde", + "CW" to "Curacao", + "CX" to "Pulau Natal", + "CY" to "Siprus", + "CZ" to "Ceko", + "DE" to "Jerman", + "DJ" to "Djibouti", + "DK" to "Denmark", + "DM" to "Dominika", + "DO" to "Republik Dominika", + "DZ" to "Aljazair", + "EC" to "Ekuador", + "EE" to "Estonia", + "EG" to "Mesir", + "EH" to "Sahara Barat", + "ER" to "Eritrea", + "ES" to "Spanyol", + "ET" to "Etiopia", + "FI" to "Finlandia", + "FJ" to "Fiji", + "FK" to "Kepulauan Falkland", + "FM" to "Mikronesia", + "FO" to "Kepulauan Faroe", + "FR" to "Prancis", + "GA" to "Gabon", + "GB" to "Britania Raya", + "GD" to "Grenada", + "GE" to "Georgia", + "GF" to "Guyana Prancis", + "GG" to "Guernsey", + "GH" to "Ghana", + "GI" to "Gibraltar", + "GL" to "Greenland", + "GM" to "Gambia", + "GN" to "Guinea", + "GP" to "Guadeloupe", + "GQ" to "Guinea Khatulistiwa", + "GR" to "Yunani", + "GS" to "Georgia Selatan dan Kepulauan Sandwich Selatan", + "GT" to "Guatemala", + "GU" to "Guam", + "GW" to "Guinea-Bissau", + "GY" to "Guyana", + "HK" to "Hong Kong", + "HM" to "Pulau Heard dan Kepulauan McDonald", + "HN" to "Honduras", + "HR" to "Kroasia", + "HT" to "Haiti", + "HU" to "Hungaria", + "ID" to "Indonesia", + "IE" to "Irlandia", + "IL" to "Israel", + "IM" to "Pulau Man", + "IN" to "India", + "IO" to "Wilayah Samudra Hindia Britania", + "IQ" to "Irak", + "IR" to "Iran", + "IS" to "Islandia", + "IT" to "Italia", + "JE" to "Jersey", + "JM" to "Jamaika", + "JO" to "Yordania", + "JP" to "Jepang", + "KE" to "Kenya", + "KG" to "Kirgizstan", + "KH" to "Kamboja", + "KI" to "Kiribati", + "KM" to "Komoro", + "KN" to "Saint Kitts dan Nevis", + "KP" to "Korea Utara", + "KR" to "Korea Selatan", + "KW" to "Kuwait", + "KY" to "Kepulauan Cayman", + "KZ" to "Kazakhstan", + "LA" to "Laos", + "LB" to "Lebanon", + "LC" to "Saint Lucia", + "LI" to "Liechtenstein", + "LK" to "Sri Lanka", + "LR" to "Liberia", + "LS" to "Lesotho", + "LT" to "Lituania", + "LU" to "Luksemburg", + "LV" to "Latvia", + "LY" to "Libya", + "MA" to "Maroko", + "MC" to "Monako", + "MD" to "Moldova", + "ME" to "Montenegro", + "MF" to "Saint Martin", + "MG" to "Madagaskar", + "MH" to "Kepulauan Marshall", + "MK" to "Makedonia Utara", + "ML" to "Mali", + "MM" to "Myanmar", + "MN" to "Mongolia", + "MO" to "Makau", + "MP" to "Kepulauan Mariana Utara", + "MQ" to "Martinik", + "MR" to "Mauritania", + "MS" to "Montserrat", + "MT" to "Malta", + "MU" to "Mauritius", + "MV" to "Maladewa", + "MW" to "Malawi", + "MX" to "Meksiko", + "MY" to "Malaysia", + "MZ" to "Mozambik", + "NA" to "Namibia", + "NC" to "Kaledonia Baru", + "NE" to "Niger", + "NF" to "Pulau Norfolk", + "NG" to "Nigeria", + "NI" to "Nikaragua", + "NL" to "Belanda", + "NO" to "Norwegia", + "NP" to "Nepal", + "NR" to "Nauru", + "NU" to "Niue", + "NZ" to "Selandia Baru", + "OM" to "Oman", + "PA" to "Panama", + "PE" to "Peru", + "PF" to "Polinesia Prancis", + "PG" to "Papua Nugini", + "PH" to "Filipina", + "PK" to "Pakistan", + "PL" to "Polandia", + "PM" to "Saint Pierre dan Miquelon", + "PN" to "Kepulauan Pitcairn", + "PR" to "Puerto Riko", + "PS" to "Palestina", + "PT" to "Portugal", + "PW" to "Palau", + "PY" to "Paraguay", + "QA" to "Qatar", + "RE" to "Reunion", + "RO" to "Rumania", + "RS" to "Serbia", + "RU" to "Rusia", + "RW" to "Rwanda", + "SA" to "Arab Saudi", + "SB" to "Kepulauan Solomon", + "SC" to "Seychelles", + "SD" to "Sudan", + "SE" to "Swedia", + "SG" to "Singapura", + "SH" to "Saint Helena, Ascension, dan Tristan da Cunha", + "SI" to "Slovenia", + "SJ" to "Svalbard dan Jan Mayen", + "SK" to "Slovakia", + "SL" to "Sierra Leone", + "SM" to "San Marino", + "SN" to "Senegal", + "SO" to "Somalia", + "SR" to "Suriname", + "SS" to "Sudan Selatan", + "ST" to "Sao Tome dan Principe", + "SV" to "El Salvador", + "SX" to "Sint Maarten", + "SY" to "Suriah", + "SZ" to "Eswatini", + "TC" to "Kepulauan Turks dan Caicos", + "TD" to "Chad", + "TF" to "Wilayah Selatan Prancis", + "TG" to "Togo", + "TH" to "Thailand", + "TJ" to "Tajikistan", + "TK" to "Tokelau", + "TL" to "Timor Leste", + "TM" to "Turkmenistan", + "TN" to "Tunisia", + "TO" to "Tonga", + "TR" to "Turki", + "TT" to "Trinidad dan Tobago", + "TV" to "Tuvalu", + "TW" to "Taiwan", + "TZ" to "Tanzania", + "UA" to "Ukraina", + "UG" to "Uganda", + "UM" to "Kepulauan Terluar Kecil Amerika Serikat", + "US" to "Amerika Serikat", + "UY" to "Uruguay", + "UZ" to "Uzbekistan", + "VA" to "Vatikan", + "VC" to "Saint Vincent dan Grenadine", + "VE" to "Venezuela", + "VG" to "Kepulauan Virgin Britania Raya", + "VI" to "Kepulauan Virgin Amerika Serikat", + "VN" to "Vietnam", + "VU" to "Vanuatu", + "WF" to "Wallis dan Futuna", + "WS" to "Samoa", + "YE" to "Yaman", + "YT" to "Mayotte", + "ZA" to "Afrika Selatan", + "ZM" to "Zambia", + "ZW" to "Zimbabwe", +) diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ItalianTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ItalianTranslations.kt new file mode 100644 index 0000000..0578f7b --- /dev/null +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ItalianTranslations.kt @@ -0,0 +1,253 @@ +package org.kimplify.countries.i18n.data + +internal val itTranslations = mapOf( + "AD" to "Andorra", + "AE" to "Emirati Arabi Uniti", + "AF" to "Afghanistan", + "AG" to "Antigua e Barbuda", + "AI" to "Anguilla", + "AL" to "Albania", + "AM" to "Armenia", + "AO" to "Angola", + "AQ" to "Antartide", + "AR" to "Argentina", + "AS" to "Samoa Americane", + "AT" to "Austria", + "AU" to "Australia", + "AW" to "Aruba", + "AX" to "Isole Aland", + "AZ" to "Azerbaigian", + "BA" to "Bosnia ed Erzegovina", + "BB" to "Barbados", + "BD" to "Bangladesh", + "BE" to "Belgio", + "BF" to "Burkina Faso", + "BG" to "Bulgaria", + "BH" to "Bahrein", + "BI" to "Burundi", + "BJ" to "Benin", + "BL" to "Saint-Barthelemy", + "BM" to "Bermuda", + "BN" to "Brunei", + "BO" to "Bolivia", + "BQ" to "Caraibi olandesi", + "BR" to "Brasile", + "BS" to "Bahamas", + "BT" to "Bhutan", + "BV" to "Isola Bouvet", + "BW" to "Botswana", + "BY" to "Bielorussia", + "BZ" to "Belize", + "CA" to "Canada", + "CC" to "Isole Cocos (Keeling)", + "CD" to "Repubblica Democratica del Congo", + "CF" to "Repubblica Centrafricana", + "CG" to "Congo", + "CH" to "Svizzera", + "CI" to "Costa d'Avorio", + "CK" to "Isole Cook", + "CL" to "Cile", + "CM" to "Camerun", + "CN" to "Cina", + "CO" to "Colombia", + "CR" to "Costa Rica", + "CU" to "Cuba", + "CV" to "Capo Verde", + "CW" to "Curacao", + "CX" to "Isola di Natale", + "CY" to "Cipro", + "CZ" to "Cechia", + "DE" to "Germania", + "DJ" to "Gibuti", + "DK" to "Danimarca", + "DM" to "Dominica", + "DO" to "Repubblica Dominicana", + "DZ" to "Algeria", + "EC" to "Ecuador", + "EE" to "Estonia", + "EG" to "Egitto", + "EH" to "Sahara Occidentale", + "ER" to "Eritrea", + "ES" to "Spagna", + "ET" to "Etiopia", + "FI" to "Finlandia", + "FJ" to "Figi", + "FK" to "Isole Falkland", + "FM" to "Micronesia", + "FO" to "Isole Faroe", + "FR" to "Francia", + "GA" to "Gabon", + "GB" to "Regno Unito", + "GD" to "Grenada", + "GE" to "Georgia", + "GF" to "Guyana francese", + "GG" to "Guernsey", + "GH" to "Ghana", + "GI" to "Gibilterra", + "GL" to "Groenlandia", + "GM" to "Gambia", + "GN" to "Guinea", + "GP" to "Guadalupa", + "GQ" to "Guinea Equatoriale", + "GR" to "Grecia", + "GS" to "Georgia del Sud e Isole Sandwich Australi", + "GT" to "Guatemala", + "GU" to "Guam", + "GW" to "Guinea-Bissau", + "GY" to "Guyana", + "HK" to "Hong Kong", + "HM" to "Isole Heard e McDonald", + "HN" to "Honduras", + "HR" to "Croazia", + "HT" to "Haiti", + "HU" to "Ungheria", + "ID" to "Indonesia", + "IE" to "Irlanda", + "IL" to "Israele", + "IM" to "Isola di Man", + "IN" to "India", + "IO" to "Territorio britannico dell'Oceano Indiano", + "IQ" to "Iraq", + "IR" to "Iran", + "IS" to "Islanda", + "IT" to "Italia", + "JE" to "Jersey", + "JM" to "Giamaica", + "JO" to "Giordania", + "JP" to "Giappone", + "KE" to "Kenya", + "KG" to "Kirghizistan", + "KH" to "Cambogia", + "KI" to "Kiribati", + "KM" to "Comore", + "KN" to "Saint Kitts e Nevis", + "KP" to "Corea del Nord", + "KR" to "Corea del Sud", + "KW" to "Kuwait", + "KY" to "Isole Cayman", + "KZ" to "Kazakistan", + "LA" to "Laos", + "LB" to "Libano", + "LC" to "Santa Lucia", + "LI" to "Liechtenstein", + "LK" to "Sri Lanka", + "LR" to "Liberia", + "LS" to "Lesotho", + "LT" to "Lituania", + "LU" to "Lussemburgo", + "LV" to "Lettonia", + "LY" to "Libia", + "MA" to "Marocco", + "MC" to "Monaco", + "MD" to "Moldavia", + "ME" to "Montenegro", + "MF" to "Saint-Martin", + "MG" to "Madagascar", + "MH" to "Isole Marshall", + "MK" to "Macedonia del Nord", + "ML" to "Mali", + "MM" to "Myanmar", + "MN" to "Mongolia", + "MO" to "Macao", + "MP" to "Isole Marianne Settentrionali", + "MQ" to "Martinica", + "MR" to "Mauritania", + "MS" to "Montserrat", + "MT" to "Malta", + "MU" to "Mauritius", + "MV" to "Maldive", + "MW" to "Malawi", + "MX" to "Messico", + "MY" to "Malesia", + "MZ" to "Mozambico", + "NA" to "Namibia", + "NC" to "Nuova Caledonia", + "NE" to "Niger", + "NF" to "Isola Norfolk", + "NG" to "Nigeria", + "NI" to "Nicaragua", + "NL" to "Paesi Bassi", + "NO" to "Norvegia", + "NP" to "Nepal", + "NR" to "Nauru", + "NU" to "Niue", + "NZ" to "Nuova Zelanda", + "OM" to "Oman", + "PA" to "Panama", + "PE" to "Peru", + "PF" to "Polinesia Francese", + "PG" to "Papua Nuova Guinea", + "PH" to "Filippine", + "PK" to "Pakistan", + "PL" to "Polonia", + "PM" to "Saint-Pierre e Miquelon", + "PN" to "Isole Pitcairn", + "PR" to "Porto Rico", + "PS" to "Palestina", + "PT" to "Portogallo", + "PW" to "Palau", + "PY" to "Paraguay", + "QA" to "Qatar", + "RE" to "Riunione", + "RO" to "Romania", + "RS" to "Serbia", + "RU" to "Russia", + "RW" to "Ruanda", + "SA" to "Arabia Saudita", + "SB" to "Isole Salomone", + "SC" to "Seychelles", + "SD" to "Sudan", + "SE" to "Svezia", + "SG" to "Singapore", + "SH" to "Sant'Elena, Ascensione e Tristan da Cunha", + "SI" to "Slovenia", + "SJ" to "Svalbard e Jan Mayen", + "SK" to "Slovacchia", + "SL" to "Sierra Leone", + "SM" to "San Marino", + "SN" to "Senegal", + "SO" to "Somalia", + "SR" to "Suriname", + "SS" to "Sudan del Sud", + "ST" to "Sao Tome e Principe", + "SV" to "El Salvador", + "SX" to "Sint Maarten", + "SY" to "Siria", + "SZ" to "Eswatini", + "TC" to "Isole Turks e Caicos", + "TD" to "Ciad", + "TF" to "Terre australi e antartiche francesi", + "TG" to "Togo", + "TH" to "Thailandia", + "TJ" to "Tagikistan", + "TK" to "Tokelau", + "TL" to "Timor Est", + "TM" to "Turkmenistan", + "TN" to "Tunisia", + "TO" to "Tonga", + "TR" to "Turchia", + "TT" to "Trinidad e Tobago", + "TV" to "Tuvalu", + "TW" to "Taiwan", + "TZ" to "Tanzania", + "UA" to "Ucraina", + "UG" to "Uganda", + "UM" to "Isole minori esterne degli Stati Uniti", + "US" to "Stati Uniti", + "UY" to "Uruguay", + "UZ" to "Uzbekistan", + "VA" to "Citta del Vaticano", + "VC" to "Saint Vincent e Grenadine", + "VE" to "Venezuela", + "VG" to "Isole Vergini Britanniche", + "VI" to "Isole Vergini Americane", + "VN" to "Vietnam", + "VU" to "Vanuatu", + "WF" to "Wallis e Futuna", + "WS" to "Samoa", + "YE" to "Yemen", + "YT" to "Mayotte", + "ZA" to "Sudafrica", + "ZM" to "Zambia", + "ZW" to "Zimbabwe", +) diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/JapaneseTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/JapaneseTranslations.kt new file mode 100644 index 0000000..219505f --- /dev/null +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/JapaneseTranslations.kt @@ -0,0 +1,253 @@ +package org.kimplify.countries.i18n.data + +internal val jaTranslations = mapOf( + "AD" to "アンドラ", + "AE" to "アラブ首長国連邦", + "AF" to "アフガニスタン", + "AG" to "アンティグア・バーブーダ", + "AI" to "アンギラ", + "AL" to "アルバニア", + "AM" to "アルメニア", + "AO" to "アンゴラ", + "AQ" to "南極", + "AR" to "アルゼンチン", + "AS" to "米領サモア", + "AT" to "オーストリア", + "AU" to "オーストラリア", + "AW" to "アルバ", + "AX" to "オーランド諸島", + "AZ" to "アゼルバイジャン", + "BA" to "ボスニア・ヘルツェゴビナ", + "BB" to "バルバドス", + "BD" to "バングラデシュ", + "BE" to "ベルギー", + "BF" to "ブルキナファソ", + "BG" to "ブルガリア", + "BH" to "バーレーン", + "BI" to "ブルンジ", + "BJ" to "ベナン", + "BL" to "サン・バルテルミー", + "BM" to "バミューダ", + "BN" to "ブルネイ", + "BO" to "ボリビア", + "BQ" to "ボネール、シント・ユースタティウスおよびサバ", + "BR" to "ブラジル", + "BS" to "バハマ", + "BT" to "ブータン", + "BV" to "ブーベ島", + "BW" to "ボツワナ", + "BY" to "ベラルーシ", + "BZ" to "ベリーズ", + "CA" to "カナダ", + "CC" to "ココス(キーリング)諸島", + "CD" to "コンゴ民主共和国", + "CF" to "中央アフリカ共和国", + "CG" to "コンゴ共和国", + "CH" to "スイス", + "CI" to "コートジボワール", + "CK" to "クック諸島", + "CL" to "チリ", + "CM" to "カメルーン", + "CN" to "中国", + "CO" to "コロンビア", + "CR" to "コスタリカ", + "CU" to "キューバ", + "CV" to "カーボベルデ", + "CW" to "キュラソー", + "CX" to "クリスマス島", + "CY" to "キプロス", + "CZ" to "チェコ", + "DE" to "ドイツ", + "DJ" to "ジブチ", + "DK" to "デンマーク", + "DM" to "ドミニカ国", + "DO" to "ドミニカ共和国", + "DZ" to "アルジェリア", + "EC" to "エクアドル", + "EE" to "エストニア", + "EG" to "エジプト", + "EH" to "西サハラ", + "ER" to "エリトリア", + "ES" to "スペイン", + "ET" to "エチオピア", + "FI" to "フィンランド", + "FJ" to "フィジー", + "FK" to "フォークランド諸島", + "FM" to "ミクロネシア連邦", + "FO" to "フェロー諸島", + "FR" to "フランス", + "GA" to "ガボン", + "GB" to "イギリス", + "GD" to "グレナダ", + "GE" to "ジョージア", + "GF" to "仏領ギアナ", + "GG" to "ガーンジー", + "GH" to "ガーナ", + "GI" to "ジブラルタル", + "GL" to "グリーンランド", + "GM" to "ガンビア", + "GN" to "ギニア", + "GP" to "グアドループ", + "GQ" to "赤道ギニア", + "GR" to "ギリシャ", + "GS" to "サウスジョージア・サウスサンドウィッチ諸島", + "GT" to "グアテマラ", + "GU" to "グアム", + "GW" to "ギニアビサウ", + "GY" to "ガイアナ", + "HK" to "香港", + "HM" to "ハード島とマクドナルド諸島", + "HN" to "ホンジュラス", + "HR" to "クロアチア", + "HT" to "ハイチ", + "HU" to "ハンガリー", + "ID" to "インドネシア", + "IE" to "アイルランド", + "IL" to "イスラエル", + "IM" to "マン島", + "IN" to "インド", + "IO" to "イギリス領インド洋地域", + "IQ" to "イラク", + "IR" to "イラン", + "IS" to "アイスランド", + "IT" to "イタリア", + "JE" to "ジャージー", + "JM" to "ジャマイカ", + "JO" to "ヨルダン", + "JP" to "日本", + "KE" to "ケニア", + "KG" to "キルギス", + "KH" to "カンボジア", + "KI" to "キリバス", + "KM" to "コモロ", + "KN" to "セントクリストファー・ネイビス", + "KP" to "北朝鮮", + "KR" to "韓国", + "KW" to "クウェート", + "KY" to "ケイマン諸島", + "KZ" to "カザフスタン", + "LA" to "ラオス", + "LB" to "レバノン", + "LC" to "セントルシア", + "LI" to "リヒテンシュタイン", + "LK" to "スリランカ", + "LR" to "リベリア", + "LS" to "レソト", + "LT" to "リトアニア", + "LU" to "ルクセンブルク", + "LV" to "ラトビア", + "LY" to "リビア", + "MA" to "モロッコ", + "MC" to "モナコ", + "MD" to "モルドバ", + "ME" to "モンテネグロ", + "MF" to "サン・マルタン", + "MG" to "マダガスカル", + "MH" to "マーシャル諸島", + "MK" to "北マケドニア", + "ML" to "マリ", + "MM" to "ミャンマー", + "MN" to "モンゴル", + "MO" to "マカオ", + "MP" to "北マリアナ諸島", + "MQ" to "マルティニーク", + "MR" to "モーリタニア", + "MS" to "モントセラト", + "MT" to "マルタ", + "MU" to "モーリシャス", + "MV" to "モルディブ", + "MW" to "マラウイ", + "MX" to "メキシコ", + "MY" to "マレーシア", + "MZ" to "モザンビーク", + "NA" to "ナミビア", + "NC" to "ニューカレドニア", + "NE" to "ニジェール", + "NF" to "ノーフォーク島", + "NG" to "ナイジェリア", + "NI" to "ニカラグア", + "NL" to "オランダ", + "NO" to "ノルウェー", + "NP" to "ネパール", + "NR" to "ナウル", + "NU" to "ニウエ", + "NZ" to "ニュージーランド", + "OM" to "オマーン", + "PA" to "パナマ", + "PE" to "ペルー", + "PF" to "仏領ポリネシア", + "PG" to "パプアニューギニア", + "PH" to "フィリピン", + "PK" to "パキスタン", + "PL" to "ポーランド", + "PM" to "サンピエール島・ミクロン島", + "PN" to "ピトケアン諸島", + "PR" to "プエルトリコ", + "PS" to "パレスチナ", + "PT" to "ポルトガル", + "PW" to "パラオ", + "PY" to "パラグアイ", + "QA" to "カタール", + "RE" to "レユニオン", + "RO" to "ルーマニア", + "RS" to "セルビア", + "RU" to "ロシア", + "RW" to "ルワンダ", + "SA" to "サウジアラビア", + "SB" to "ソロモン諸島", + "SC" to "セーシェル", + "SD" to "スーダン", + "SE" to "スウェーデン", + "SG" to "シンガポール", + "SH" to "セントヘレナ・アセンションおよびトリスタンダクーニャ", + "SI" to "スロベニア", + "SJ" to "スヴァールバル諸島およびヤンマイエン島", + "SK" to "スロバキア", + "SL" to "シエラレオネ", + "SM" to "サンマリノ", + "SN" to "セネガル", + "SO" to "ソマリア", + "SR" to "スリナム", + "SS" to "南スーダン", + "ST" to "サントメ・プリンシペ", + "SV" to "エルサルバドル", + "SX" to "シント・マールテン", + "SY" to "シリア", + "SZ" to "エスワティニ", + "TC" to "タークス・カイコス諸島", + "TD" to "チャド", + "TF" to "仏領南方・南極地域", + "TG" to "トーゴ", + "TH" to "タイ", + "TJ" to "タジキスタン", + "TK" to "トケラウ", + "TL" to "東ティモール", + "TM" to "トルクメニスタン", + "TN" to "チュニジア", + "TO" to "トンガ", + "TR" to "トルコ", + "TT" to "トリニダード・トバゴ", + "TV" to "ツバル", + "TW" to "台湾", + "TZ" to "タンザニア", + "UA" to "ウクライナ", + "UG" to "ウガンダ", + "UM" to "合衆国領有小離島", + "US" to "アメリカ合衆国", + "UY" to "ウルグアイ", + "UZ" to "ウズベキスタン", + "VA" to "バチカン市国", + "VC" to "セントビンセントおよびグレナディーン諸島", + "VE" to "ベネズエラ", + "VG" to "イギリス領ヴァージン諸島", + "VI" to "アメリカ領ヴァージン諸島", + "VN" to "ベトナム", + "VU" to "バヌアツ", + "WF" to "ウォリス・フツナ", + "WS" to "サモア", + "YE" to "イエメン", + "YT" to "マヨット", + "ZA" to "南アフリカ", + "ZM" to "ザンビア", + "ZW" to "ジンバブエ", +) diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/KoreanTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/KoreanTranslations.kt new file mode 100644 index 0000000..2f98e22 --- /dev/null +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/KoreanTranslations.kt @@ -0,0 +1,253 @@ +package org.kimplify.countries.i18n.data + +internal val koTranslations = mapOf( + "AD" to "안도라", + "AE" to "아랍에미리트", + "AF" to "아프가니스탄", + "AG" to "앤티가 바부다", + "AI" to "앵귈라", + "AL" to "알바니아", + "AM" to "아르메니아", + "AO" to "앙골라", + "AQ" to "남극", + "AR" to "아르헨티나", + "AS" to "아메리칸사모아", + "AT" to "오스트리아", + "AU" to "오스트레일리아", + "AW" to "아루바", + "AX" to "올란드 제도", + "AZ" to "아제르바이잔", + "BA" to "보스니아 헤르체고비나", + "BB" to "바베이도스", + "BD" to "방글라데시", + "BE" to "벨기에", + "BF" to "부르키나파소", + "BG" to "불가리아", + "BH" to "바레인", + "BI" to "부룬디", + "BJ" to "베냉", + "BL" to "생바르텔레미", + "BM" to "버뮤다", + "BN" to "브루나이", + "BO" to "볼리비아", + "BQ" to "카리브 네덜란드", + "BR" to "브라질", + "BS" to "바하마", + "BT" to "부탄", + "BV" to "부베 섬", + "BW" to "보츠와나", + "BY" to "벨라루스", + "BZ" to "벨리즈", + "CA" to "캐나다", + "CC" to "코코스 제도", + "CD" to "콩고 민주 공화국", + "CF" to "중앙아프리카 공화국", + "CG" to "콩고 공화국", + "CH" to "스위스", + "CI" to "코트디부아르", + "CK" to "쿡 제도", + "CL" to "칠레", + "CM" to "카메룬", + "CN" to "중국", + "CO" to "콜롬비아", + "CR" to "코스타리카", + "CU" to "쿠바", + "CV" to "카보베르데", + "CW" to "퀴라소", + "CX" to "크리스마스 섬", + "CY" to "키프로스", + "CZ" to "체코", + "DE" to "독일", + "DJ" to "지부티", + "DK" to "덴마크", + "DM" to "도미니카 연방", + "DO" to "도미니카 공화국", + "DZ" to "알제리", + "EC" to "에콰도르", + "EE" to "에스토니아", + "EG" to "이집트", + "EH" to "서사하라", + "ER" to "에리트레아", + "ES" to "스페인", + "ET" to "에티오피아", + "FI" to "핀란드", + "FJ" to "피지", + "FK" to "포클랜드 제도", + "FM" to "미크로네시아 연방", + "FO" to "페로 제도", + "FR" to "프랑스", + "GA" to "가봉", + "GB" to "영국", + "GD" to "그레나다", + "GE" to "조지아", + "GF" to "프랑스령 기아나", + "GG" to "건지", + "GH" to "가나", + "GI" to "지브롤터", + "GL" to "그린란드", + "GM" to "감비아", + "GN" to "기니", + "GP" to "과들루프", + "GQ" to "적도 기니", + "GR" to "그리스", + "GS" to "사우스조지아 사우스샌드위치 제도", + "GT" to "과테말라", + "GU" to "괌", + "GW" to "기니비사우", + "GY" to "가이아나", + "HK" to "홍콩", + "HM" to "허드 맥도널드 제도", + "HN" to "온두라스", + "HR" to "크로아티아", + "HT" to "아이티", + "HU" to "헝가리", + "ID" to "인도네시아", + "IE" to "아일랜드", + "IL" to "이스라엘", + "IM" to "맨 섬", + "IN" to "인도", + "IO" to "영국령 인도양 지역", + "IQ" to "이라크", + "IR" to "이란", + "IS" to "아이슬란드", + "IT" to "이탈리아", + "JE" to "저지", + "JM" to "자메이카", + "JO" to "요르단", + "JP" to "일본", + "KE" to "케냐", + "KG" to "키르기스스탄", + "KH" to "캄보디아", + "KI" to "키리바시", + "KM" to "코모로", + "KN" to "세인트키츠 네비스", + "KP" to "북한", + "KR" to "대한민국", + "KW" to "쿠웨이트", + "KY" to "케이맨 제도", + "KZ" to "카자흐스탄", + "LA" to "라오스", + "LB" to "레바논", + "LC" to "세인트루시아", + "LI" to "리히텐슈타인", + "LK" to "스리랑카", + "LR" to "라이베리아", + "LS" to "레소토", + "LT" to "리투아니아", + "LU" to "룩셈부르크", + "LV" to "라트비아", + "LY" to "리비아", + "MA" to "모로코", + "MC" to "모나코", + "MD" to "몰도바", + "ME" to "몬테네그로", + "MF" to "생마르탱", + "MG" to "마다가스카르", + "MH" to "마셜 제도", + "MK" to "북마케도니아", + "ML" to "말리", + "MM" to "미얀마", + "MN" to "몽골", + "MO" to "마카오", + "MP" to "북마리아나 제도", + "MQ" to "마르티니크", + "MR" to "모리타니", + "MS" to "몬트세랫", + "MT" to "몰타", + "MU" to "모리셔스", + "MV" to "몰디브", + "MW" to "말라위", + "MX" to "멕시코", + "MY" to "말레이시아", + "MZ" to "모잠비크", + "NA" to "나미비아", + "NC" to "누벨칼레도니", + "NE" to "니제르", + "NF" to "노퍽 섬", + "NG" to "나이지리아", + "NI" to "니카라과", + "NL" to "네덜란드", + "NO" to "노르웨이", + "NP" to "네팔", + "NR" to "나우루", + "NU" to "니우에", + "NZ" to "뉴질랜드", + "OM" to "오만", + "PA" to "파나마", + "PE" to "페루", + "PF" to "프랑스령 폴리네시아", + "PG" to "파푸아뉴기니", + "PH" to "필리핀", + "PK" to "파키스탄", + "PL" to "폴란드", + "PM" to "생피에르 미클롱", + "PN" to "핏케언 제도", + "PR" to "푸에르토리코", + "PS" to "팔레스타인", + "PT" to "포르투갈", + "PW" to "팔라우", + "PY" to "파라과이", + "QA" to "카타르", + "RE" to "레위니옹", + "RO" to "루마니아", + "RS" to "세르비아", + "RU" to "러시아", + "RW" to "르완다", + "SA" to "사우디아라비아", + "SB" to "솔로몬 제도", + "SC" to "세이셸", + "SD" to "수단", + "SE" to "스웨덴", + "SG" to "싱가포르", + "SH" to "세인트헬레나 어센션 트리스탄다쿠냐", + "SI" to "슬로베니아", + "SJ" to "스발바르 얀마옌", + "SK" to "슬로바키아", + "SL" to "시에라리온", + "SM" to "산마리노", + "SN" to "세네갈", + "SO" to "소말리아", + "SR" to "수리남", + "SS" to "남수단", + "ST" to "상투메 프린시페", + "SV" to "엘살바도르", + "SX" to "신트마르턴", + "SY" to "시리아", + "SZ" to "에스와티니", + "TC" to "터크스 케이커스 제도", + "TD" to "차드", + "TF" to "프랑스령 남방 및 남극 지역", + "TG" to "토고", + "TH" to "태국", + "TJ" to "타지키스탄", + "TK" to "토켈라우", + "TL" to "동티모르", + "TM" to "투르크메니스탄", + "TN" to "튀니지", + "TO" to "통가", + "TR" to "튀르키예", + "TT" to "트리니다드 토바고", + "TV" to "투발루", + "TW" to "대만", + "TZ" to "탄자니아", + "UA" to "우크라이나", + "UG" to "우간다", + "UM" to "미국령 군소 제도", + "US" to "미국", + "UY" to "우루과이", + "UZ" to "우즈베키스탄", + "VA" to "바티칸 시국", + "VC" to "세인트빈센트 그레나딘", + "VE" to "베네수엘라", + "VG" to "영국령 버진아일랜드", + "VI" to "미국령 버진아일랜드", + "VN" to "베트남", + "VU" to "바누아투", + "WF" to "왈리스 퓌튀나", + "WS" to "사모아", + "YE" to "예멘", + "YT" to "마요트", + "ZA" to "남아프리카 공화국", + "ZM" to "잠비아", + "ZW" to "짐바브웨", +) diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/PortugueseTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/PortugueseTranslations.kt new file mode 100644 index 0000000..e698bd7 --- /dev/null +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/PortugueseTranslations.kt @@ -0,0 +1,253 @@ +package org.kimplify.countries.i18n.data + +internal val ptTranslations = mapOf( + "AD" to "Andorra", + "AE" to "Emirados Arabes Unidos", + "AF" to "Afeganistao", + "AG" to "Antigua e Barbuda", + "AI" to "Anguilla", + "AL" to "Albania", + "AM" to "Armenia", + "AO" to "Angola", + "AQ" to "Antartida", + "AR" to "Argentina", + "AS" to "Samoa Americana", + "AT" to "Austria", + "AU" to "Australia", + "AW" to "Aruba", + "AX" to "Ilhas Aland", + "AZ" to "Azerbaijao", + "BA" to "Bosnia e Herzegovina", + "BB" to "Barbados", + "BD" to "Bangladesh", + "BE" to "Belgica", + "BF" to "Burkina Faso", + "BG" to "Bulgaria", + "BH" to "Barein", + "BI" to "Burundi", + "BJ" to "Benim", + "BL" to "Sao Bartolomeu", + "BM" to "Bermudas", + "BN" to "Brunei", + "BO" to "Bolivia", + "BQ" to "Caribe Holandes", + "BR" to "Brasil", + "BS" to "Bahamas", + "BT" to "Butao", + "BV" to "Ilha Bouvet", + "BW" to "Botsuana", + "BY" to "Belarus", + "BZ" to "Belize", + "CA" to "Canada", + "CC" to "Ilhas Cocos (Keeling)", + "CD" to "Republica Democratica do Congo", + "CF" to "Republica Centro-Africana", + "CG" to "Congo", + "CH" to "Suica", + "CI" to "Costa do Marfim", + "CK" to "Ilhas Cook", + "CL" to "Chile", + "CM" to "Camaroes", + "CN" to "China", + "CO" to "Colombia", + "CR" to "Costa Rica", + "CU" to "Cuba", + "CV" to "Cabo Verde", + "CW" to "Curacao", + "CX" to "Ilha Christmas", + "CY" to "Chipre", + "CZ" to "Chequia", + "DE" to "Alemanha", + "DJ" to "Djibuti", + "DK" to "Dinamarca", + "DM" to "Dominica", + "DO" to "Republica Dominicana", + "DZ" to "Argelia", + "EC" to "Equador", + "EE" to "Estonia", + "EG" to "Egito", + "EH" to "Saara Ocidental", + "ER" to "Eritreia", + "ES" to "Espanha", + "ET" to "Etiopia", + "FI" to "Finlandia", + "FJ" to "Fiji", + "FK" to "Ilhas Malvinas", + "FM" to "Micronesia", + "FO" to "Ilhas Faroe", + "FR" to "Franca", + "GA" to "Gabao", + "GB" to "Reino Unido", + "GD" to "Granada", + "GE" to "Georgia", + "GF" to "Guiana Francesa", + "GG" to "Guernsey", + "GH" to "Gana", + "GI" to "Gibraltar", + "GL" to "Gronelandia", + "GM" to "Gambia", + "GN" to "Guine", + "GP" to "Guadalupe", + "GQ" to "Guine Equatorial", + "GR" to "Grecia", + "GS" to "Ilhas Georgia do Sul e Sandwich do Sul", + "GT" to "Guatemala", + "GU" to "Guam", + "GW" to "Guine-Bissau", + "GY" to "Guiana", + "HK" to "Hong Kong", + "HM" to "Ilhas Heard e McDonald", + "HN" to "Honduras", + "HR" to "Croacia", + "HT" to "Haiti", + "HU" to "Hungria", + "ID" to "Indonesia", + "IE" to "Irlanda", + "IL" to "Israel", + "IM" to "Ilha de Man", + "IN" to "India", + "IO" to "Territorio Britanico do Oceano Indico", + "IQ" to "Iraque", + "IR" to "Ira", + "IS" to "Islandia", + "IT" to "Italia", + "JE" to "Jersey", + "JM" to "Jamaica", + "JO" to "Jordania", + "JP" to "Japao", + "KE" to "Quenia", + "KG" to "Quirguistao", + "KH" to "Camboja", + "KI" to "Kiribati", + "KM" to "Comores", + "KN" to "Sao Cristovao e Nevis", + "KP" to "Coreia do Norte", + "KR" to "Coreia do Sul", + "KW" to "Kuwait", + "KY" to "Ilhas Caiman", + "KZ" to "Cazaquistao", + "LA" to "Laos", + "LB" to "Libano", + "LC" to "Santa Lucia", + "LI" to "Liechtenstein", + "LK" to "Sri Lanka", + "LR" to "Liberia", + "LS" to "Lesoto", + "LT" to "Lituania", + "LU" to "Luxemburgo", + "LV" to "Letonia", + "LY" to "Libia", + "MA" to "Marrocos", + "MC" to "Monaco", + "MD" to "Moldavia", + "ME" to "Montenegro", + "MF" to "Sao Martinho", + "MG" to "Madagascar", + "MH" to "Ilhas Marshall", + "MK" to "Macedonia do Norte", + "ML" to "Mali", + "MM" to "Mianmar", + "MN" to "Mongolia", + "MO" to "Macau", + "MP" to "Ilhas Marianas do Norte", + "MQ" to "Martinica", + "MR" to "Mauritania", + "MS" to "Montserrat", + "MT" to "Malta", + "MU" to "Mauricio", + "MV" to "Maldivas", + "MW" to "Malawi", + "MX" to "Mexico", + "MY" to "Malasia", + "MZ" to "Mocambique", + "NA" to "Namibia", + "NC" to "Nova Caledonia", + "NE" to "Niger", + "NF" to "Ilha Norfolk", + "NG" to "Nigeria", + "NI" to "Nicaragua", + "NL" to "Paises Baixos", + "NO" to "Noruega", + "NP" to "Nepal", + "NR" to "Nauru", + "NU" to "Niue", + "NZ" to "Nova Zelandia", + "OM" to "Oma", + "PA" to "Panama", + "PE" to "Peru", + "PF" to "Polinesia Francesa", + "PG" to "Papua-Nova Guine", + "PH" to "Filipinas", + "PK" to "Paquistao", + "PL" to "Polonia", + "PM" to "Sao Pedro e Miquelon", + "PN" to "Ilhas Pitcairn", + "PR" to "Porto Rico", + "PS" to "Palestina", + "PT" to "Portugal", + "PW" to "Palau", + "PY" to "Paraguai", + "QA" to "Catar", + "RE" to "Reuniao", + "RO" to "Romenia", + "RS" to "Servia", + "RU" to "Russia", + "RW" to "Ruanda", + "SA" to "Arabia Saudita", + "SB" to "Ilhas Salomao", + "SC" to "Seicheles", + "SD" to "Sudao", + "SE" to "Suecia", + "SG" to "Singapura", + "SH" to "Santa Helena, Ascensao e Tristao da Cunha", + "SI" to "Eslovenia", + "SJ" to "Svalbard e Jan Mayen", + "SK" to "Eslovaquia", + "SL" to "Serra Leoa", + "SM" to "San Marino", + "SN" to "Senegal", + "SO" to "Somalia", + "SR" to "Suriname", + "SS" to "Sudao do Sul", + "ST" to "Sao Tome e Principe", + "SV" to "El Salvador", + "SX" to "Sint Maarten", + "SY" to "Siria", + "SZ" to "Eswatini", + "TC" to "Ilhas Turks e Caicos", + "TD" to "Chade", + "TF" to "Terras Austrais e Antarticas Francesas", + "TG" to "Togo", + "TH" to "Tailandia", + "TJ" to "Tajiquistao", + "TK" to "Tokelau", + "TL" to "Timor-Leste", + "TM" to "Turcomenistao", + "TN" to "Tunisia", + "TO" to "Tonga", + "TR" to "Turquia", + "TT" to "Trinidad e Tobago", + "TV" to "Tuvalu", + "TW" to "Taiwan", + "TZ" to "Tanzania", + "UA" to "Ucrania", + "UG" to "Uganda", + "UM" to "Ilhas Menores Distantes dos Estados Unidos", + "US" to "Estados Unidos", + "UY" to "Uruguai", + "UZ" to "Uzbequistao", + "VA" to "Vaticano", + "VC" to "Sao Vicente e Granadinas", + "VE" to "Venezuela", + "VG" to "Ilhas Virgens Britanicas", + "VI" to "Ilhas Virgens Americanas", + "VN" to "Vietna", + "VU" to "Vanuatu", + "WF" to "Wallis e Futuna", + "WS" to "Samoa", + "YE" to "Iemen", + "YT" to "Maiote", + "ZA" to "Africa do Sul", + "ZM" to "Zambia", + "ZW" to "Zimbabue", +) diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/RussianTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/RussianTranslations.kt index 99520c1..9cc6383 100644 --- a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/RussianTranslations.kt +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/RussianTranslations.kt @@ -245,7 +245,6 @@ internal val ruTranslations = mapOf( "VU" to "Вануату", "WF" to "Уоллис и Футуна", "WS" to "Самоа", - "XK" to "Республика Косово", "YE" to "Йемен", "YT" to "Майотта", "ZA" to "Южная Африка", diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/SpanishTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/SpanishTranslations.kt index c7598a2..9f10b3a 100644 --- a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/SpanishTranslations.kt +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/SpanishTranslations.kt @@ -245,7 +245,6 @@ internal val esTranslations = mapOf( "VU" to "Vanuatu", "WF" to "Wallis y Futuna", "WS" to "Samoa", - "XK" to "Kosovo", "YE" to "Yemen", "YT" to "Mayotte", "ZA" to "Sudáfrica", diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/TurkishTranslations.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/TurkishTranslations.kt new file mode 100644 index 0000000..d809004 --- /dev/null +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/TurkishTranslations.kt @@ -0,0 +1,253 @@ +package org.kimplify.countries.i18n.data + +internal val trTranslations = mapOf( + "AD" to "Andorra", + "AE" to "Birlesik Arap Emirlikleri", + "AF" to "Afganistan", + "AG" to "Antigua ve Barbuda", + "AI" to "Anguilla", + "AL" to "Arnavutluk", + "AM" to "Ermenistan", + "AO" to "Angola", + "AQ" to "Antarktika", + "AR" to "Arjantin", + "AS" to "Amerikan Samoasi", + "AT" to "Avusturya", + "AU" to "Avustralya", + "AW" to "Aruba", + "AX" to "Aland Adalari", + "AZ" to "Azerbaycan", + "BA" to "Bosna-Hersek", + "BB" to "Barbados", + "BD" to "Banglades", + "BE" to "Belcika", + "BF" to "Burkina Faso", + "BG" to "Bulgaristan", + "BH" to "Bahreyn", + "BI" to "Burundi", + "BJ" to "Benin", + "BL" to "Saint Barthelemy", + "BM" to "Bermuda", + "BN" to "Brunei", + "BO" to "Bolivya", + "BQ" to "Karayip Hollandasi", + "BR" to "Brezilya", + "BS" to "Bahamalar", + "BT" to "Bhutan", + "BV" to "Bouvet Adasi", + "BW" to "Botsvana", + "BY" to "Belarus", + "BZ" to "Belize", + "CA" to "Kanada", + "CC" to "Cocos (Keeling) Adalari", + "CD" to "Kongo Demokratik Cumhuriyeti", + "CF" to "Orta Afrika Cumhuriyeti", + "CG" to "Kongo", + "CH" to "Isvicre", + "CI" to "Fildisi Sahili", + "CK" to "Cook Adalari", + "CL" to "Sili", + "CM" to "Kamerun", + "CN" to "Cin", + "CO" to "Kolombiya", + "CR" to "Kosta Rika", + "CU" to "Kuba", + "CV" to "Cabo Verde", + "CW" to "Curacao", + "CX" to "Christmas Adasi", + "CY" to "Kibris", + "CZ" to "Cekya", + "DE" to "Almanya", + "DJ" to "Cibuti", + "DK" to "Danimarka", + "DM" to "Dominika", + "DO" to "Dominik Cumhuriyeti", + "DZ" to "Cezayir", + "EC" to "Ekvador", + "EE" to "Estonya", + "EG" to "Misir", + "EH" to "Bati Sahra", + "ER" to "Eritre", + "ES" to "Ispanya", + "ET" to "Etiyopya", + "FI" to "Finlandiya", + "FJ" to "Fiji", + "FK" to "Falkland Adalari", + "FM" to "Mikronezya", + "FO" to "Faroe Adalari", + "FR" to "Fransa", + "GA" to "Gabon", + "GB" to "Birlesik Krallik", + "GD" to "Grenada", + "GE" to "Gurcistan", + "GF" to "Fransiz Guyanasi", + "GG" to "Guernsey", + "GH" to "Gana", + "GI" to "Cebelitarik", + "GL" to "Gronland", + "GM" to "Gambiya", + "GN" to "Gine", + "GP" to "Guadeloupe", + "GQ" to "Ekvator Ginesi", + "GR" to "Yunanistan", + "GS" to "Guney Georgia ve Guney Sandwich Adalari", + "GT" to "Guatemala", + "GU" to "Guam", + "GW" to "Gine-Bissau", + "GY" to "Guyana", + "HK" to "Hong Kong", + "HM" to "Heard Adasi ve McDonald Adalari", + "HN" to "Honduras", + "HR" to "Hirvatistan", + "HT" to "Haiti", + "HU" to "Macaristan", + "ID" to "Endonezya", + "IE" to "Irlanda", + "IL" to "Israil", + "IM" to "Man Adasi", + "IN" to "Hindistan", + "IO" to "Britanya Hint Okyanusu Topraklari", + "IQ" to "Irak", + "IR" to "Iran", + "IS" to "Izlanda", + "IT" to "Italya", + "JE" to "Jersey", + "JM" to "Jamaika", + "JO" to "Urdun", + "JP" to "Japonya", + "KE" to "Kenya", + "KG" to "Kirgizistan", + "KH" to "Kamboçya", + "KI" to "Kiribati", + "KM" to "Komorlar", + "KN" to "Saint Kitts ve Nevis", + "KP" to "Kuzey Kore", + "KR" to "Guney Kore", + "KW" to "Kuveyt", + "KY" to "Cayman Adalari", + "KZ" to "Kazakistan", + "LA" to "Laos", + "LB" to "Lubnan", + "LC" to "Saint Lucia", + "LI" to "Lihtenstayn", + "LK" to "Sri Lanka", + "LR" to "Liberya", + "LS" to "Lesotho", + "LT" to "Litvanya", + "LU" to "Luksemburg", + "LV" to "Letonya", + "LY" to "Libya", + "MA" to "Fas", + "MC" to "Monako", + "MD" to "Moldova", + "ME" to "Karadag", + "MF" to "Saint Martin", + "MG" to "Madagaskar", + "MH" to "Marshall Adalari", + "MK" to "Kuzey Makedonya", + "ML" to "Mali", + "MM" to "Myanmar", + "MN" to "Mogolistan", + "MO" to "Makao", + "MP" to "Kuzey Mariana Adalari", + "MQ" to "Martinik", + "MR" to "Moritanya", + "MS" to "Montserrat", + "MT" to "Malta", + "MU" to "Mauritius", + "MV" to "Maldivler", + "MW" to "Malavi", + "MX" to "Meksika", + "MY" to "Malezya", + "MZ" to "Mozambik", + "NA" to "Namibya", + "NC" to "Yeni Kaledonya", + "NE" to "Nijer", + "NF" to "Norfolk Adasi", + "NG" to "Nijerya", + "NI" to "Nikaragua", + "NL" to "Hollanda", + "NO" to "Norvec", + "NP" to "Nepal", + "NR" to "Nauru", + "NU" to "Niue", + "NZ" to "Yeni Zelanda", + "OM" to "Umman", + "PA" to "Panama", + "PE" to "Peru", + "PF" to "Fransiz Polinezyasi", + "PG" to "Papua Yeni Gine", + "PH" to "Filipinler", + "PK" to "Pakistan", + "PL" to "Polonya", + "PM" to "Saint Pierre ve Miquelon", + "PN" to "Pitcairn Adalari", + "PR" to "Porto Riko", + "PS" to "Filistin", + "PT" to "Portekiz", + "PW" to "Palau", + "PY" to "Paraguay", + "QA" to "Katar", + "RE" to "Reunion", + "RO" to "Romanya", + "RS" to "Sirbistan", + "RU" to "Rusya", + "RW" to "Ruanda", + "SA" to "Suudi Arabistan", + "SB" to "Solomon Adalari", + "SC" to "Seyseller", + "SD" to "Sudan", + "SE" to "Isvec", + "SG" to "Singapur", + "SH" to "Saint Helena, Ascension ve Tristan da Cunha", + "SI" to "Slovenya", + "SJ" to "Svalbard ve Jan Mayen", + "SK" to "Slovakya", + "SL" to "Sierra Leone", + "SM" to "San Marino", + "SN" to "Senegal", + "SO" to "Somali", + "SR" to "Surinam", + "SS" to "Guney Sudan", + "ST" to "Sao Tome ve Principe", + "SV" to "El Salvador", + "SX" to "Sint Maarten", + "SY" to "Suriye", + "SZ" to "Esvatini", + "TC" to "Turks ve Caicos Adalari", + "TD" to "Cad", + "TF" to "Fransiz Guney Topraklari", + "TG" to "Togo", + "TH" to "Tayland", + "TJ" to "Tacikistan", + "TK" to "Tokelau", + "TL" to "Dogu Timor", + "TM" to "Turkmenistan", + "TN" to "Tunus", + "TO" to "Tonga", + "TR" to "Turkiye", + "TT" to "Trinidad ve Tobago", + "TV" to "Tuvalu", + "TW" to "Tayvan", + "TZ" to "Tanzanya", + "UA" to "Ukrayna", + "UG" to "Uganda", + "UM" to "ABD Kucuk Harici Adalari", + "US" to "Amerika Birlesik Devletleri", + "UY" to "Uruguay", + "UZ" to "Ozbekistan", + "VA" to "Vatikan", + "VC" to "Saint Vincent ve Grenadinler", + "VE" to "Venezuela", + "VG" to "Britanya Virjin Adalari", + "VI" to "ABD Virjin Adalari", + "VN" to "Vietnam", + "VU" to "Vanuatu", + "WF" to "Wallis ve Futuna", + "WS" to "Samoa", + "YE" to "Yemen", + "YT" to "Mayotte", + "ZA" to "Guney Afrika", + "ZM" to "Zambiya", + "ZW" to "Zimbabve", +) diff --git a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/extensions/CountryI18nExtensions.kt b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/extensions/CountryI18nExtensions.kt index 8924807..f2583a7 100644 --- a/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/extensions/CountryI18nExtensions.kt +++ b/countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/extensions/CountryI18nExtensions.kt @@ -16,8 +16,18 @@ fun Country.getLocalizedName(locale: Locale): String { } fun Country.getLocalizedName(localeCode: String = "en"): String { - return when (localeCode.lowercase()) { - "en" -> getDisplayName() - else -> getLocalizedName(Locale(localeCode)) + val normalized = localeCode + .split('-', '_') + .firstOrNull() + ?.lowercase() + ?: return getDisplayName() + + if (normalized == "en") return getDisplayName() + if (normalized.length != 2) return getDisplayName() + + return try { + getLocalizedName(Locale(normalized)) + } catch (_: IllegalArgumentException) { + getDisplayName() } } diff --git a/countries-i18n/src/commonTest/kotlin/org/kimplify/countries/i18n/TranslationTest.kt b/countries-i18n/src/commonTest/kotlin/org/kimplify/countries/i18n/TranslationTest.kt index f55b245..783ba22 100644 --- a/countries-i18n/src/commonTest/kotlin/org/kimplify/countries/i18n/TranslationTest.kt +++ b/countries-i18n/src/commonTest/kotlin/org/kimplify/countries/i18n/TranslationTest.kt @@ -1,6 +1,7 @@ package org.kimplify.countries.i18n import org.kimplify.countries.Countries +import org.kimplify.countries.extensions.getDisplayName import org.kimplify.countries.i18n.extensions.getLocalizedName import org.kimplify.countries.model.Alpha2Code import kotlin.test.Test @@ -79,15 +80,22 @@ class TranslationTest { } @Test - fun `supportedLocales contains all 6 languages`() { + fun `supportedLocales contains all 13 languages`() { val locales = CountryTranslations.supportedLocales - assertEquals(6, locales.size) + assertEquals(13, locales.size) assertTrue(locales.contains(Locale.ES)) assertTrue(locales.contains(Locale.FR)) assertTrue(locales.contains(Locale.DE)) assertTrue(locales.contains(Locale.AR)) assertTrue(locales.contains(Locale.ZH)) assertTrue(locales.contains(Locale.RU)) + assertTrue(locales.contains(Locale.JA)) + assertTrue(locales.contains(Locale.PT)) + assertTrue(locales.contains(Locale.HI)) + assertTrue(locales.contains(Locale.KO)) + assertTrue(locales.contains(Locale.IT)) + assertTrue(locales.contains(Locale.TR)) + assertTrue(locales.contains(Locale.ID)) } @Test @@ -136,7 +144,7 @@ class TranslationTest { val translatedCount = allCountries.count { country -> CountryTranslations.getTranslation(country.alpha2.value, Locale.ES) != null } - assertTrue(translatedCount >= 245) + assertEquals(249, translatedCount) } @Test @@ -152,4 +160,29 @@ class TranslationTest { assertNotNull(translation) assertEquals("España", translation) } + + @Test + fun getLocalizedNameNormalizesLocaleStrings() { + val us = Countries.repository.findByAlpha2(Alpha2Code("US"))!! + assertEquals(us.getLocalizedName("es"), us.getLocalizedName(Locale.ES)) + assertEquals(us.getLocalizedName("es"), us.getLocalizedName("ES")) + assertEquals(us.getLocalizedName("es"), us.getLocalizedName("es-MX")) + assertEquals(us.getLocalizedName("pt"), us.getLocalizedName("pt_BR")) + val fallback = us.getLocalizedName("xyz") + assertEquals(us.getDisplayName(), fallback) + } + + @Test + fun allTranslationLocalesHaveComplete249Entries() { + val allCountries = Countries.repository.getAll() + CountryTranslations.supportedLocales.forEach { locale -> + var count = 0 + allCountries.forEach { country -> + if (CountryTranslations.getTranslation(country.alpha2.value, locale) != null) { + count++ + } + } + assertEquals(249, count, "Locale ${locale.code} has only $count translations, expected 249") + } + } } diff --git a/docs/superpowers/plans/2026-03-24-kcountries-full-sweep.md b/docs/superpowers/plans/2026-03-24-kcountries-full-sweep.md new file mode 100644 index 0000000..71c0976 --- /dev/null +++ b/docs/superpowers/plans/2026-03-24-kcountries-full-sweep.md @@ -0,0 +1,1351 @@ +# KCountries Full Sweep Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Fix all bugs, extend the Country model with region/calling code/currency/timezone, complete i18n with 7 new languages, and polish the query API. + +**Architecture:** 4-phase approach (Fix → Extend → i18n → Polish). All new data fields go directly in the `Country` data class. Translations are per-locale files in `countries-i18n`. Query DSL gains new predicates and combinators. + +**Tech Stack:** Kotlin Multiplatform (Android, iOS, JVM, JS, WasmJS), Gradle with version catalogs, `de.cketti.unicode:kotlin-codepoints` for emoji validation. + +**Spec:** `docs/superpowers/specs/2026-03-24-kcountries-full-sweep-design.md` + +--- + +## Sprint 1: Critical Bug Fixes & Stability + +### Task 1: Fix CI workflows + +**Files:** +- Modify: `.github/workflows/build.yml` +- Modify: `.github/workflows/publish.yml` + +- [ ] **Step 1: Fix `build.yml` — replace `:deci:*` with correct module paths** + +Replace all occurrences of `:deci:` with the correct module names. The test job should run tests for both `:countries-core` and `:countries-i18n` across all platforms. The build job should build both modules. Fix `actions/checkout@v5` → `actions/checkout@v6`. Fix artifact upload paths from `deci/build/` to `countries-core/build/` and `countries-i18n/build/`. + +- [ ] **Step 2: Fix `publish.yml` — update checkout action** + +Change `actions/checkout@v5` to `actions/checkout@v6` at line 13. + +- [ ] **Step 3: Commit** + +```bash +git add .github/workflows/build.yml .github/workflows/publish.yml +git commit -m "fix: correct CI workflows — replace :deci: references, standardize checkout@v6" +``` + +--- + +### Task 2: Build-generated `Countries.VERSION` + +**Files:** +- Modify: `countries-core/build.gradle.kts:10-54` (add version generation task) +- Modify: `countries-core/src/commonMain/kotlin/org/kimplify/countries/Countries.kt:42` (remove hardcoded VERSION) + +- [ ] **Step 1: Add version generation in `countries-core/build.gradle.kts`** + +After the `kotlin { ... }` block, add a Gradle task that generates a `BuildKConfig.kt` into a build directory and registers it as a `commonMain` source: + +```kotlin +val generateVersionFile = tasks.register("generateVersionFile") { + val version = libs.versions.kcountries.get() + val outputDir = layout.buildDirectory.dir("generated/version/kotlin") + outputs.dir(outputDir) + doLast { + val dir = outputDir.get().asFile.resolve("org/kimplify/countries") + dir.mkdirs() + dir.resolve("BuildKConfig.kt").writeText( + """ + |package org.kimplify.countries + | + |internal object BuildKConfig { + | const val VERSION = "$version" + |} + """.trimMargin() + ) + } +} + +kotlin.sourceSets.commonMain { + kotlin.srcDir(generateVersionFile.map { it.outputs.files.singleFile }) +} +``` + +- [ ] **Step 2: Update `Countries.kt` to use generated version** + +In `countries-core/src/commonMain/kotlin/org/kimplify/countries/Countries.kt`, change line 42 from: + +```kotlin +const val VERSION = "1.0.0" +``` + +to: + +```kotlin +val VERSION = BuildKConfig.VERSION +``` + +Note: This changes from `const val` to `val` since it now reads from a generated object. This is acceptable — the value is still a compile-time constant in the generated file. + +- [ ] **Step 3: Run tests to verify nothing broke** + +Run: `./gradlew :countries-core:jvmTest` +Expected: All tests pass. + +- [ ] **Step 4: Commit** + +```bash +git add countries-core/build.gradle.kts countries-core/src/commonMain/kotlin/org/kimplify/countries/Countries.kt +git commit -m "fix: generate Countries.VERSION from version catalog instead of hardcoding" +``` + +--- + +### Task 3: Fix `FlagEmoji` validation with `kotlin-codepoints` + +**Files:** +- Modify: `countries-core/src/commonMain/kotlin/org/kimplify/countries/model/CountryCodes.kt:81-87` +- Modify: `countries-core/src/commonTest/kotlin/org/kimplify/countries/model/CountryCodesValidationTest.kt:61-72` + +- [ ] **Step 1: Update the `FlagEmoji` validation test** + +In `CountryCodesValidationTest.kt`, replace the existing `flagEmojiEnforcesValidLength` test (lines 61-72) with a more precise test: + +```kotlin +@Test +fun flagEmojiRequiresExactlyTwoRegionalIndicatorCodepoints() { + // Valid flag emojis (2 regional indicator symbols) + FlagEmoji("🇺🇸") // US + FlagEmoji("🇬🇧") // GB + FlagEmoji("🇯🇵") // JP + + // Reject ASCII strings that happen to have length 4 + assertFailsWith { FlagEmoji("ABCD") } + // Reject single regional indicator + assertFailsWith { FlagEmoji("🇺") } + // Reject empty + assertFailsWith { FlagEmoji("") } + // Reject non-flag emoji + assertFailsWith { FlagEmoji("😀😀") } +} +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `./gradlew :countries-core:jvmTest --tests "*.CountryCodesValidationTest.flagEmojiRequiresExactlyTwoRegionalIndicatorCodepoints"` +Expected: FAIL — current validation accepts `"ABCD"`. + +- [ ] **Step 3: Implement proper `FlagEmoji` validation** + +In `CountryCodes.kt`, add the import at the top: + +```kotlin +import de.cketti.unicode.codePointCount +import de.cketti.unicode.forEachCodePoint +``` + +Replace the `FlagEmoji` value class (lines 81-87) with: + +```kotlin +@JvmInline +value class FlagEmoji(val value: String) { + init { + require(value.codePointCount() == 2) { "Flag emoji must consist of exactly 2 codepoints" } + value.forEachCodePoint { codePoint -> + require(codePoint in 0x1F1E6..0x1F1FF) { + "Flag emoji must consist of regional indicator symbols (U+1F1E6..U+1F1FF)" + } + } + } +} +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `./gradlew :countries-core:jvmTest --tests "*.CountryCodesValidationTest"` +Expected: All tests pass. + +- [ ] **Step 5: Run full test suite to verify no regressions** + +Run: `./gradlew :countries-core:jvmTest` +Expected: All tests pass (all 249 countries' flags pass the new validation). + +- [ ] **Step 6: Commit** + +```bash +git add countries-core/src/commonMain/kotlin/org/kimplify/countries/model/CountryCodes.kt countries-core/src/commonTest/kotlin/org/kimplify/countries/model/CountryCodesValidationTest.kt +git commit -m "fix: validate FlagEmoji using codepoints instead of string length" +``` + +--- + +### Task 4: Fix Kosovo translations, country data inaccuracies, SDK versions, and Locale annotation + +**Files:** +- Modify: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/SpanishTranslations.kt` (remove XK) +- Modify: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/FrenchTranslations.kt` (remove XK) +- Modify: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/GermanTranslations.kt` (remove XK) +- Modify: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ArabicTranslations.kt` (remove XK) +- Modify: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ChineseTranslations.kt` (remove XK) +- Modify: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/RussianTranslations.kt` (remove XK) +- Modify: `countries-core/src/commonMain/kotlin/org/kimplify/countries/data/CountriesData.kt` (Turkey, Belgium, Peru) +- Modify: `countries-core/build.gradle.kts:56-63` (compileSdk, minSdk) +- Modify: `countries-i18n/build.gradle.kts:56-63` (compileSdk, minSdk) +- Modify: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/Locale.kt:3` (annotation) + +- [ ] **Step 1: Remove `"XK"` from all 6 translation files** + +In each translation file, find the line `"XK" to "..."` and delete it: +- `SpanishTranslations.kt`: remove `"XK" to "Kosovo"` +- `FrenchTranslations.kt`: remove `"XK" to "Kosovo"` +- `GermanTranslations.kt`: remove `"XK" to "Kosovo"` +- `ArabicTranslations.kt`: remove `"XK" to "كوسوفو"` +- `ChineseTranslations.kt`: remove `"XK" to "科索沃"` +- `RussianTranslations.kt`: remove the `"XK" to "..."` entry (value is `"Республика Косово"`) + +- [ ] **Step 2: Fix Turkey in `CountriesData.kt`** + +Find the Turkey entry (around line 1845) and change: +- `name = CountryName("Turkey")` → `name = CountryName("Türkiye")` +- Add `displayName = "Türkiye"` (currently not set) + +- [ ] **Step 3: Fix Belgium in `CountriesData.kt`** + +Find the Belgium entry (around line 173) and change: +- `native = "Belgien"` → `native = "België / Belgique"` + +- [ ] **Step 4: Fix Peru in `CountriesData.kt`** + +Find the Peru entry (around line 1431) and change: +- `native = "Piruw"` → `native = "Perú"` + +- [ ] **Step 5: Fix `compileSdk` and `minSdk` in both library build files** + +In `countries-core/build.gradle.kts` (lines 57-60), change: + +```kotlin +compileSdk = 35 +defaultConfig { + minSdk = 21 +} +``` + +to: + +```kotlin +compileSdk = libs.versions.android.compileSdk.get().toInt() +defaultConfig { + minSdk = libs.versions.android.minSdk.get().toInt() +} +``` + +Apply the same change in `countries-i18n/build.gradle.kts` (same lines). + +- [ ] **Step 6: Fix `Locale` annotation** + +In `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/Locale.kt`, change line 3 from: + +```kotlin +@kotlin.jvm.JvmInline +``` + +to: + +```kotlin +import kotlin.jvm.JvmInline + +@JvmInline +``` + +- [ ] **Step 7: Run all tests** + +Run: `./gradlew :countries-core:jvmTest :countries-i18n:jvmTest` +Expected: All tests pass. (The translation count test uses `>= 245` so removing one entry per map won't break it.) + +- [ ] **Step 8: Commit** + +```bash +git add countries-core/src/commonMain/kotlin/org/kimplify/countries/data/CountriesData.kt \ + countries-core/build.gradle.kts countries-i18n/build.gradle.kts \ + countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/Locale.kt \ + countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ +git commit -m "fix: data inaccuracies (Turkey/Belgium/Peru), remove orphaned XK translations, fix SDK versions and Locale annotation" +``` + +--- + +## Sprint 2: Extend the Country Model + +### Task 5: Add new value types (`Continent`, `Region`, `CallingCode`, `CurrencyCode`, `TimezoneId`) + +**Files:** +- Create: `countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Continent.kt` +- Create: `countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Region.kt` +- Create: `countries-core/src/commonMain/kotlin/org/kimplify/countries/model/CountryMetadata.kt` (CallingCode, CurrencyCode, TimezoneId) +- Test: `countries-core/src/commonTest/kotlin/org/kimplify/countries/model/CountryMetadataValidationTest.kt` + +- [ ] **Step 1: Write validation tests for new value types** + +Create `CountryMetadataValidationTest.kt`: + +```kotlin +package org.kimplify.countries.model + +import kotlin.test.Test +import kotlin.test.assertFailsWith + +class CountryMetadataValidationTest { + + @Test + fun callingCodeRequiresPlusPrefixAndDigits() { + CallingCode("+1") + CallingCode("+44") + CallingCode("+380") + CallingCode("+1868") + + assertFailsWith { CallingCode("1") } + assertFailsWith { CallingCode("+") } + assertFailsWith { CallingCode("+12345") } + assertFailsWith { CallingCode("") } + assertFailsWith { CallingCode("+abc") } + } + + @Test + fun currencyCodeRequiresThreeUppercaseLetters() { + CurrencyCode("USD") + CurrencyCode("EUR") + CurrencyCode("JPY") + + assertFailsWith { CurrencyCode("usd") } + assertFailsWith { CurrencyCode("US") } + assertFailsWith { CurrencyCode("USDX") } + assertFailsWith { CurrencyCode("") } + assertFailsWith { CurrencyCode("123") } + } + + @Test + fun timezoneIdRequiresIanaFormatOrUtc() { + TimezoneId("America/New_York") + TimezoneId("Europe/London") + TimezoneId("UTC") + TimezoneId("Asia/Tokyo") + + assertFailsWith { TimezoneId("") } + assertFailsWith { TimezoneId("EST") } + assertFailsWith { TimezoneId("NewYork") } + } +} +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `./gradlew :countries-core:jvmTest --tests "*.CountryMetadataValidationTest"` +Expected: FAIL — classes don't exist yet. + +- [ ] **Step 3: Create `Continent.kt`** + +```kotlin +package org.kimplify.countries.model + +enum class Continent { + AFRICA, + ANTARCTICA, + ASIA, + EUROPE, + NORTH_AMERICA, + OCEANIA, + SOUTH_AMERICA +} +``` + +- [ ] **Step 4: Create `Region.kt`** + +```kotlin +package org.kimplify.countries.model + +enum class Region { + ANTARCTICA, + AUSTRALIA_AND_NEW_ZEALAND, + CARIBBEAN, + CENTRAL_AMERICA, + CENTRAL_ASIA, + EASTERN_AFRICA, + EASTERN_ASIA, + EASTERN_EUROPE, + MELANESIA, + MICRONESIA, + MIDDLE_AFRICA, + NORTHERN_AFRICA, + NORTHERN_AMERICA, + NORTHERN_EUROPE, + POLYNESIA, + SOUTH_AMERICA, + SOUTHEASTERN_ASIA, + SOUTHERN_AFRICA, + SOUTHERN_ASIA, + SOUTHERN_EUROPE, + WESTERN_AFRICA, + WESTERN_ASIA, + WESTERN_EUROPE +} +``` + +- [ ] **Step 5: Create `CountryMetadata.kt`** + +```kotlin +package org.kimplify.countries.model + +import kotlin.jvm.JvmInline + +@JvmInline +value class CallingCode(val value: String) { + init { + require(value.matches(PATTERN)) { + "Calling code must be '+' followed by 1-4 digits (base E.164 code, e.g. \"+1\")" + } + } + companion object { + private val PATTERN = Regex("^\\+\\d{1,4}$") + } +} + +@JvmInline +value class CurrencyCode(val value: String) { + init { + require(value.matches(PATTERN)) { + "Currency code must be 3 uppercase letters (ISO 4217)" + } + } + companion object { + private val PATTERN = Regex("^[A-Z]{3}$") + } +} + +@JvmInline +value class TimezoneId(val value: String) { + init { + require(value.contains("/") || value == "UTC") { + "Timezone must be IANA format (e.g. \"America/New_York\") or \"UTC\"" + } + } +} +``` + +- [ ] **Step 6: Run tests to verify they pass** + +Run: `./gradlew :countries-core:jvmTest --tests "*.CountryMetadataValidationTest"` +Expected: All 3 tests pass. + +- [ ] **Step 7: Commit** + +```bash +git add countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Continent.kt \ + countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Region.kt \ + countries-core/src/commonMain/kotlin/org/kimplify/countries/model/CountryMetadata.kt \ + countries-core/src/commonTest/kotlin/org/kimplify/countries/model/CountryMetadataValidationTest.kt +git commit -m "feat: add Continent, Region, CallingCode, CurrencyCode, TimezoneId types" +``` + +--- + +### Task 6: Extend `Country` data class, update `TestCountries`, and populate all `CountriesData` + +**Files:** +- Modify: `countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Country.kt:16-24` +- Modify: `countries-core/src/commonTest/kotlin/org/kimplify/countries/testdata/TestCountries.kt` +- Modify: `countries-core/src/commonMain/kotlin/org/kimplify/countries/data/CountriesData.kt` (all 249 entries) + +**Important:** The Country class extension and CountriesData population MUST happen in the same commit to keep the build compilable. Never commit a Country class with new required fields while CountriesData still uses the old constructor. + +- [ ] **Step 1: Add new fields to `Country` data class** + +In `Country.kt`, update the data class (lines 16-24) to: + +```kotlin +/** + * Represents a country according to the ISO 3166-1 standard. + * + * @property alpha2 ISO 3166-1 alpha-2 code (e.g., "US") + * @property alpha3 ISO 3166-1 alpha-3 code (e.g., "USA") + * @property numeric ISO 3166-1 numeric code (e.g., "840") + * @property name Official ISO English name + * @property flag Unicode flag emoji + * @property displayName Optional common/short English name + * @property native Optional native language name + * @property continent Geographic continent + * @property region UN geoscheme region + * @property callingCode International calling code (E.164) + * @property currency Primary currency code (ISO 4217) + * @property timezone Primary IANA timezone identifier + */ +data class Country( + val alpha2: Alpha2Code, + val alpha3: Alpha3Code, + val numeric: NumericCode, + val name: CountryName, + val flag: FlagEmoji, + val displayName: String? = null, + val native: String? = null, + val continent: Continent, + val region: Region, + val callingCode: CallingCode, + val currency: CurrencyCode, + val timezone: TimezoneId +) +``` + +Note: Non-default fields after default fields is fine — all construction in this codebase uses named parameters. + +- [ ] **Step 2: Update `TestCountries.kt` with new fields** + +Update each test country object: + +```kotlin +val unitedStates = Country( + alpha2 = Alpha2Code("US"), + alpha3 = Alpha3Code("USA"), + numeric = NumericCode("840"), + name = CountryName("United States of America (the)"), + flag = FlagEmoji("🇺🇸"), + displayName = "United States", + native = "United States", + continent = Continent.NORTH_AMERICA, + region = Region.NORTHERN_AMERICA, + callingCode = CallingCode("+1"), + currency = CurrencyCode("USD"), + timezone = TimezoneId("America/New_York") +) + +val unitedKingdom = Country( + alpha2 = Alpha2Code("GB"), + alpha3 = Alpha3Code("GBR"), + numeric = NumericCode("826"), + name = CountryName("United Kingdom of Great Britain and Northern Ireland (the)"), + flag = FlagEmoji("🇬🇧"), + displayName = "United Kingdom", + native = "United Kingdom", + continent = Continent.EUROPE, + region = Region.NORTHERN_EUROPE, + callingCode = CallingCode("+44"), + currency = CurrencyCode("GBP"), + timezone = TimezoneId("Europe/London") +) + +val canada = Country( + alpha2 = Alpha2Code("CA"), + alpha3 = Alpha3Code("CAN"), + numeric = NumericCode("124"), + name = CountryName("Canada"), + flag = FlagEmoji("🇨🇦"), + continent = Continent.NORTH_AMERICA, + region = Region.NORTHERN_AMERICA, + callingCode = CallingCode("+1"), + currency = CurrencyCode("CAD"), + timezone = TimezoneId("America/Toronto") +) + +val france = Country( + alpha2 = Alpha2Code("FR"), + alpha3 = Alpha3Code("FRA"), + numeric = NumericCode("250"), + name = CountryName("France"), + flag = FlagEmoji("🇫🇷"), + native = "France", + continent = Continent.EUROPE, + region = Region.WESTERN_EUROPE, + callingCode = CallingCode("+33"), + currency = CurrencyCode("EUR"), + timezone = TimezoneId("Europe/Paris") +) +``` + +- [ ] **Step 3: Populate all 249 country entries in `CountriesData.kt`** + +For each country entry, add the 5 new named parameters. Example for Andorra: + +Before: +```kotlin +Country( + alpha2 = Alpha2Code("AD"), + alpha3 = Alpha3Code("AND"), + numeric = NumericCode("020"), + name = CountryName("Andorra"), + flag = FlagEmoji("🇦🇩"), + native = "Andorra" +), +``` + +After: +```kotlin +Country( + alpha2 = Alpha2Code("AD"), + alpha3 = Alpha3Code("AND"), + numeric = NumericCode("020"), + name = CountryName("Andorra"), + flag = FlagEmoji("🇦🇩"), + native = "Andorra", + continent = Continent.EUROPE, + region = Region.SOUTHERN_EUROPE, + callingCode = CallingCode("+376"), + currency = CurrencyCode("EUR"), + timezone = TimezoneId("Europe/Andorra") +), +``` + +This is the largest sub-step (~1,245 data points). Work by continent for manageable chunks. Data sources: +- **Continents & Regions:** UN M49 geoscheme +- **Calling codes:** ITU-T E.164 (base country code with `+` prefix, e.g. `"+1"` for US/Canada) +- **Currencies:** ISO 4217 +- **Timezones:** IANA Time Zone Database (most representative timezone per country) + +Add required imports at top of `CountriesData.kt`: +```kotlin +import org.kimplify.countries.model.Continent +import org.kimplify.countries.model.Region +import org.kimplify.countries.model.CallingCode +import org.kimplify.countries.model.CurrencyCode +import org.kimplify.countries.model.TimezoneId +``` + +- [ ] **Step 4: Run full test suite** + +Run: `./gradlew :countries-core:jvmTest` +Expected: All tests pass (249 countries compile with valid new fields, TestCountries-based tests pass). + +- [ ] **Step 5: Commit** + +```bash +git add countries-core/src/commonMain/kotlin/org/kimplify/countries/model/Country.kt \ + countries-core/src/commonTest/kotlin/org/kimplify/countries/testdata/TestCountries.kt \ + countries-core/src/commonMain/kotlin/org/kimplify/countries/data/CountriesData.kt +git commit -m "feat: extend Country with continent, region, callingCode, currency, timezone and populate all 249 entries" +``` + +--- + +### Task 7: Add repository query methods and DSL predicates for new fields + +**Files:** +- Modify: `countries-core/src/commonMain/kotlin/org/kimplify/countries/repository/CountriesRepository.kt:15-124` +- Modify: `countries-core/src/commonMain/kotlin/org/kimplify/countries/dsl/CountriesQuery.kt:36-195` +- Test: `countries-core/src/commonTest/kotlin/org/kimplify/countries/repository/CountriesRepositoryTest.kt` +- Test: `countries-core/src/commonTest/kotlin/org/kimplify/countries/dsl/CountriesQueryTest.kt` + +- [ ] **Step 1: Write repository tests for new query methods** + +Add to `CountriesRepositoryTest.kt`: + +```kotlin +@Test +fun canFindCountriesByContinent() { + val result = repository.getByContinent(Continent.NORTH_AMERICA) + assertEquals(2, result.size) // US and Canada from test data + assertTrue(result.all { it.continent == Continent.NORTH_AMERICA }) +} + +@Test +fun canFindCountriesByRegion() { + val result = repository.getByRegion(Region.NORTHERN_AMERICA) + assertEquals(2, result.size) +} + +@Test +fun canFindCountriesByCallingCode() { + val result = repository.getByCallingCode(CallingCode("+1")) + assertEquals(2, result.size) // US and Canada share +1 +} + +@Test +fun canFindCountriesByCurrency() { + val result = repository.getByCurrency(CurrencyCode("EUR")) + assertEquals(1, result.size) // France + assertEquals("FR", result.first().alpha2.value) +} +``` + +- [ ] **Step 2: Write DSL query tests for new predicates** + +Add to `CountriesQueryTest.kt`: + +```kotlin +@Test +fun continentPredicateFiltersCorrectly() { + val result = repository.query { + continent(Continent.EUROPE) + } + assertEquals(2, result.count()) // UK and France +} + +@Test +fun regionPredicateFiltersCorrectly() { + val result = repository.query { + region(Region.WESTERN_EUROPE) + } + assertEquals(1, result.count()) // France +} + +@Test +fun callingCodePredicateFiltersCorrectly() { + val result = repository.query { + callingCode("+1") + } + assertEquals(2, result.count()) // US and Canada +} + +@Test +fun currencyPredicateFiltersCorrectly() { + val result = repository.query { + currency("GBP") + } + assertEquals(1, result.count()) // UK +} + +@Test +fun timezonePredicateFiltersCorrectly() { + val result = repository.query { + timezone("Europe/Paris") + } + assertEquals(1, result.count()) // France +} +``` + +- [ ] **Step 3: Run tests to verify they fail** + +Run: `./gradlew :countries-core:jvmTest --tests "*.CountriesRepositoryTest" --tests "*.CountriesQueryTest"` +Expected: FAIL — methods don't exist yet. + +- [ ] **Step 4: Add methods to `CountriesRepository` interface** + +In `CountriesRepository.kt`, add to the interface (after `searchByName` around line 55): + +```kotlin +fun getByContinent(continent: Continent): List +fun getByRegion(region: Region): List +fun getByCallingCode(callingCode: CallingCode): List +fun getByCurrency(currencyCode: CurrencyCode): List +``` + +Add imports: +```kotlin +import org.kimplify.countries.model.Continent +import org.kimplify.countries.model.Region +import org.kimplify.countries.model.CallingCode +import org.kimplify.countries.model.CurrencyCode +``` + +- [ ] **Step 5: Implement in `InMemoryCountriesRepository`** + +Add lazy index maps (after the existing three around line 97): + +```kotlin +private val continentIndex: Map> by lazy { + countries.groupBy { it.continent } +} +private val regionIndex: Map> by lazy { + countries.groupBy { it.region } +} +private val callingCodeIndex: Map> by lazy { + countries.groupBy { it.callingCode } +} +private val currencyIndex: Map> by lazy { + countries.groupBy { it.currency } +} +``` + +Add implementations (after existing find methods): + +```kotlin +override fun getByContinent(continent: Continent): List = + continentIndex[continent] ?: emptyList() + +override fun getByRegion(region: Region): List = + regionIndex[region] ?: emptyList() + +override fun getByCallingCode(callingCode: CallingCode): List = + callingCodeIndex[callingCode] ?: emptyList() + +override fun getByCurrency(currencyCode: CurrencyCode): List = + currencyIndex[currencyCode] ?: emptyList() +``` + +- [ ] **Step 6: Add DSL predicates to `CountriesQuery`** + +In `CountriesQuery.kt`, add after the existing `nameStartsWith` function (around line 158): + +```kotlin +fun continent(continent: Continent) { + predicates.add { it.continent == continent } +} + +fun region(region: Region) { + predicates.add { it.region == region } +} + +fun callingCode(code: String) { + predicates.add { it.callingCode.value == code } +} + +fun currency(code: String) { + predicates.add { it.currency.value == code } +} + +fun timezone(id: String) { + predicates.add { it.timezone.value == id } +} +``` + +Add imports: +```kotlin +import org.kimplify.countries.model.Continent +import org.kimplify.countries.model.Region +``` + +- [ ] **Step 7: Run tests to verify they pass** + +Run: `./gradlew :countries-core:jvmTest` +Expected: All tests pass. + +- [ ] **Step 8: Commit** + +```bash +git add countries-core/src/commonMain/kotlin/org/kimplify/countries/repository/CountriesRepository.kt \ + countries-core/src/commonMain/kotlin/org/kimplify/countries/dsl/CountriesQuery.kt \ + countries-core/src/commonTest/kotlin/org/kimplify/countries/repository/CountriesRepositoryTest.kt \ + countries-core/src/commonTest/kotlin/org/kimplify/countries/dsl/CountriesQueryTest.kt +git commit -m "feat: add repository query methods and DSL predicates for continent, region, calling code, currency, timezone" +``` + +--- + +### Task 8: Add extension functions for new fields + +**Files:** +- Modify: `countries-core/src/commonMain/kotlin/org/kimplify/countries/extensions/CountryExtensions.kt` +- Modify: `countries-core/src/commonTest/kotlin/org/kimplify/countries/extensions/CountryExtensionsTest.kt` + +- [ ] **Step 1: Write tests for new extension properties** + +Add to `CountryExtensionsTest.kt`: + +```kotlin +@Test +fun newFieldExtensionsExposeCountryData() { + assertEquals("+1", "US".callingCode) + assertEquals("USD", "US".currencyCode) + assertEquals(Continent.NORTH_AMERICA, "US".continent) + assertEquals(Region.NORTHERN_AMERICA, "US".region) + assertEquals("America/New_York", "US".timezone) + + // Invalid codes return null + assertNull("ZZ".callingCode) + assertNull("ZZ".currencyCode) + assertNull("ZZ".continent) + assertNull("ZZ".region) + assertNull("ZZ".timezone) +} +``` + +Add imports for `Continent`, `Region`. + +- [ ] **Step 2: Run test to verify it fails** + +Run: `./gradlew :countries-core:jvmTest --tests "*.CountryExtensionsTest.newFieldExtensionsExposeCountryData"` +Expected: FAIL — properties don't exist yet. + +- [ ] **Step 3: Implement extension properties** + +In `CountryExtensions.kt`, add after the existing extensions (after line 153): + +```kotlin +/** + * Looks up the international calling code for this alpha-2 country code. + * Returns null if no country matches. + */ +val String.callingCode: String? + get() = this.toCountry()?.callingCode?.value + +/** + * Looks up the ISO 4217 currency code for this alpha-2 country code. + * Returns null if no country matches. + */ +val String.currencyCode: String? + get() = this.toCountry()?.currency?.value + +/** + * Looks up the continent for this alpha-2 country code. + * Returns null if no country matches. + */ +val String.continent: Continent? + get() = this.toCountry()?.continent + +/** + * Looks up the UN geoscheme region for this alpha-2 country code. + * Returns null if no country matches. + */ +val String.region: Region? + get() = this.toCountry()?.region + +/** + * Looks up the primary IANA timezone for this alpha-2 country code. + * Returns null if no country matches. + */ +val String.timezone: String? + get() = this.toCountry()?.timezone?.value +``` + +Add imports: +```kotlin +import org.kimplify.countries.model.Continent +import org.kimplify.countries.model.Region +``` + +- [ ] **Step 4: Run tests to verify they pass** + +Run: `./gradlew :countries-core:jvmTest --tests "*.CountryExtensionsTest"` +Expected: All tests pass. + +- [ ] **Step 5: Commit** + +```bash +git add countries-core/src/commonMain/kotlin/org/kimplify/countries/extensions/CountryExtensions.kt \ + countries-core/src/commonTest/kotlin/org/kimplify/countries/extensions/CountryExtensionsTest.kt +git commit -m "feat: add String extension properties for callingCode, currencyCode, continent, region, timezone" +``` + +--- + +## Sprint 3: Complete i18n + +### Task 9: Complete Chinese translations and add 7 new languages + +**Files:** +- Modify: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ChineseTranslations.kt` (add 5 missing) +- Create: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/JapaneseTranslations.kt` +- Create: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/PortugueseTranslations.kt` +- Create: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/HindiTranslations.kt` +- Create: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/KoreanTranslations.kt` +- Create: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/ItalianTranslations.kt` +- Create: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/TurkishTranslations.kt` +- Create: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/IndonesianTranslations.kt` +- Modify: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/Locale.kt` (add KO, IT, TR, ID) +- Modify: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/CountryTranslations.kt` (register new locales) + +- [ ] **Step 1: Add 5 missing Chinese translations** + +In `ChineseTranslations.kt`, add: +```kotlin +"CN" to "中国", +"HK" to "中国香港特别行政区", +"MO" to "中国澳门特别行政区", +"SG" to "新加坡", +"TW" to "中国台湾省", +``` + +Insert these in alphabetical order by alpha-2 code among existing entries. + +- [ ] **Step 2: Add `Locale` constants for new languages** + +In `Locale.kt`, add to the companion object (after `HI`): + +```kotlin +val KO = Locale("ko") +val IT = Locale("it") +val TR = Locale("tr") +val ID = Locale("id") +``` + +- [ ] **Step 3: Create all 7 new translation files** + +Each file follows the same pattern as existing ones. Create in `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/data/`: + +- `JapaneseTranslations.kt` — `internal val jaTranslations = mapOf(...)` with all 249 entries +- `PortugueseTranslations.kt` — `internal val ptTranslations = mapOf(...)` with all 249 entries +- `HindiTranslations.kt` — `internal val hiTranslations = mapOf(...)` with all 249 entries +- `KoreanTranslations.kt` — `internal val koTranslations = mapOf(...)` with all 249 entries +- `ItalianTranslations.kt` — `internal val itTranslations = mapOf(...)` with all 249 entries +- `TurkishTranslations.kt` — `internal val trTranslations = mapOf(...)` with all 249 entries +- `IndonesianTranslations.kt` — `internal val idTranslations = mapOf(...)` with all 249 entries + +Each must have exactly 249 entries matching the alpha-2 codes in `CountriesData`. + +- [ ] **Step 4: Register all new locales in `CountryTranslations.kt`** + +In `CountryTranslations.kt`, update the `translationMaps`: + +```kotlin +private val translationMaps: Map> = mapOf( + Locale.ES to esTranslations, + Locale.FR to frTranslations, + Locale.DE to deTranslations, + Locale.AR to arTranslations, + Locale.ZH to zhTranslations, + Locale.RU to ruTranslations, + Locale.JA to jaTranslations, + Locale.PT to ptTranslations, + Locale.HI to hiTranslations, + Locale.KO to koTranslations, + Locale.IT to itTranslations, + Locale.TR to trTranslations, + Locale.ID to idTranslations +) +``` + +Add imports for the new translation maps. + +- [ ] **Step 5: Run tests** + +Run: `./gradlew :countries-i18n:jvmTest` +Expected: All existing tests pass. The `supportedLocales` test will need updating (see Task 11). + +- [ ] **Step 6: Commit** + +```bash +git add countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/ +git commit -m "feat: add JA, PT, HI, KO, IT, TR, ID translations, complete ZH gaps" +``` + +--- + +### Task 10: Fix locale string handling and update translation tests + +**Files:** +- Modify: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/extensions/CountryI18nExtensions.kt:18-23` +- Modify: `countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/CountryTranslations.kt:20-22` (normalize String overload) +- Modify: `countries-i18n/src/commonTest/kotlin/org/kimplify/countries/i18n/TranslationTest.kt` + +- [ ] **Step 1: Write tests for locale normalization** + +Add to `TranslationTest.kt`: + +```kotlin +@Test +fun getLocalizedNameNormalizesLocaleStrings() { + val us = Countries.repository.findByAlpha2(Alpha2Code("US"))!! + + // Standard format + assertEquals(us.getLocalizedName("es"), us.getLocalizedName(Locale.ES)) + // Uppercase + assertEquals(us.getLocalizedName("es"), us.getLocalizedName("ES")) + // With region code (hyphen) + assertEquals(us.getLocalizedName("es"), us.getLocalizedName("es-MX")) + // With region code (underscore) + assertEquals(us.getLocalizedName("pt"), us.getLocalizedName("pt_BR")) + // Invalid string falls back gracefully instead of crashing + val fallback = us.getLocalizedName("xyz") + assertEquals(us.getDisplayName(), fallback) +} + +@Test +fun supportedLocalesContainsAll13Languages() { + val locales = CountryTranslations.supportedLocales + assertEquals(13, locales.size) + assertTrue(locales.containsAll(setOf( + Locale.ES, Locale.FR, Locale.DE, Locale.AR, Locale.ZH, Locale.RU, + Locale.JA, Locale.PT, Locale.HI, Locale.KO, Locale.IT, Locale.TR, Locale.ID + ))) +} + +@Test +fun allTranslationLocalesHaveComplete249Entries() { + val allCountries = Countries.repository.getAll() + CountryTranslations.supportedLocales.forEach { locale -> + var count = 0 + allCountries.forEach { country -> + if (CountryTranslations.getTranslation(country.alpha2.value, locale) != null) { + count++ + } + } + assertEquals(249, count, "Locale ${locale.value} has only $count translations, expected 249") + } +} +``` + +- [ ] **Step 2: Run tests to verify locale normalization fails** + +Run: `./gradlew :countries-i18n:jvmTest --tests "*.TranslationTest.getLocalizedNameNormalizesLocaleStrings"` +Expected: FAIL — `getLocalizedName("ES")` throws `IllegalArgumentException`. + +- [ ] **Step 3: Implement locale string normalization** + +In `CountryI18nExtensions.kt`, replace the `getLocalizedName(localeCode: String)` function (lines 18-23) with: + +```kotlin +fun Country.getLocalizedName(localeCode: String = "en"): String { + val normalized = localeCode + .split('-', '_') + .firstOrNull() + ?.lowercase() + ?: return getDisplayName() + + if (normalized == "en") return getDisplayName() + if (normalized.length != 2) return getDisplayName() + + return try { + getLocalizedName(Locale(normalized)) + } catch (_: IllegalArgumentException) { + getDisplayName() + } +} +``` + +- [ ] **Step 4: Also normalize `CountryTranslations.getTranslation(String, String)`** + +In `CountryTranslations.kt`, replace the String overload (lines 20-22) with: + +```kotlin +fun getTranslation(alpha2: String, localeCode: String): String? { + val normalized = localeCode.split('-', '_').firstOrNull()?.lowercase() ?: return null + if (normalized.length != 2) return null + return try { + getTranslation(alpha2, Locale(normalized)) + } catch (_: IllegalArgumentException) { + null + } +} +``` + +This ensures both public String-accepting APIs handle locale normalization consistently. + +- [ ] **Step 5: Update the existing `supportedLocales` test** + +In `TranslationTest.kt`, find the old `supportedLocales contains all 6 languages` test (lines 81-91) and remove it (replaced by the new `supportedLocalesContainsAll13Languages` test above). + +- [ ] **Step 6: Update old translation count assertion** + +Find the `Spanish translations cover all countries` test (lines 133-140) and update the assertion from `>= 245` to `== 249`. + +- [ ] **Step 7: Run all i18n tests** + +Run: `./gradlew :countries-i18n:jvmTest` +Expected: All tests pass. + +- [ ] **Step 8: Commit** + +```bash +git add countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/extensions/CountryI18nExtensions.kt \ + countries-i18n/src/commonMain/kotlin/org/kimplify/countries/i18n/CountryTranslations.kt \ + countries-i18n/src/commonTest/kotlin/org/kimplify/countries/i18n/TranslationTest.kt +git commit -m "feat: normalize locale strings in getLocalizedName and getTranslation, update tests for 13 locales" +``` + +--- + +## Sprint 4: API Improvements & Polish + +### Task 11: Make `CountriesQueryResult` implement `Iterable`, add `@DslMarker`, `not {}`, and fix edge cases + +**Files:** +- Modify: `countries-core/src/commonMain/kotlin/org/kimplify/countries/dsl/CountriesQuery.kt` +- Modify: `countries-core/src/commonTest/kotlin/org/kimplify/countries/dsl/CountriesQueryTest.kt` + +- [ ] **Step 1: Write tests for all API improvements** + +Add to `CountriesQueryTest.kt`: + +```kotlin +@Test +fun queryResultIsIterable() { + val result = repository.query { continent(Continent.EUROPE) } + val collected = mutableListOf() + for (country in result) { + collected.add(country) + } + assertEquals(result.toList(), collected) +} + +@Test +fun notCombinatorsExcludesMatchingCountries() { + val result = repository.query { + not { continent(Continent.EUROPE) } + } + assertTrue(result.toList().none { it.continent == Continent.EUROPE }) + assertEquals(2, result.count()) // US and Canada +} + +@Test +fun orWithEmptyBlockDoesNotFilterOutEverything() { + val result = repository.query { + or { } + } + assertEquals(4, result.count()) // All test countries +} + +@Test +fun nameContainsWithBlankStringIsNoOp() { + val result = repository.query { + nameContains("") + } + assertEquals(4, result.count()) // All test countries — no filter applied +} +``` + +Add import for `Continent`. + +- [ ] **Step 2: Run tests to verify they fail** + +Run: `./gradlew :countries-core:jvmTest --tests "*.CountriesQueryTest"` +Expected: FAIL — `Iterable`, `not {}`, empty `or {}` guard, and `nameContains("")` guard don't exist yet. + +- [ ] **Step 3: Add `@DslMarker` annotation** + +At the top of `CountriesQuery.kt` (after the imports), add: + +```kotlin +@DslMarker +annotation class CountriesDsl +``` + +Then annotate the `CountriesQuery` class: + +```kotlin +@CountriesDsl +class CountriesQuery internal constructor( +``` + +- [ ] **Step 4: Make `CountriesQueryResult` implement `Iterable`** + +Change the class declaration (around line 205): + +```kotlin +class CountriesQueryResult internal constructor( + private val countries: List +) : Iterable { + override fun iterator(): Iterator = countries.iterator() +``` + +- [ ] **Step 5: Add `not {}` combinator** + +In `CountriesQuery`, add after the `or` function: + +```kotlin +fun not(block: CountriesQuery.() -> Unit) { + val subQuery = CountriesQuery(repository) + subQuery.block() + if (subQuery.predicates.isEmpty()) return + predicates.add { country -> + !subQuery.predicates.any { it(country) } + } +} +``` + +- [ ] **Step 6: Guard `or {}` empty block** + +In the existing `or` function (around line 178), add a guard after executing the block: + +```kotlin +fun or(block: CountriesQuery.() -> Unit) { + val subQuery = CountriesQuery(repository) + subQuery.block() + if (subQuery.predicates.isEmpty()) return + predicates.add { country -> + subQuery.predicates.any { it(country) } + } +} +``` + +- [ ] **Step 7: Make `nameContains("")` a no-op** + +In the `nameContains` function (around line 105), add a guard at the top: + +```kotlin +fun nameContains(text: String) { + if (text.isBlank()) return + // ... existing predicate logic +} +``` + +- [ ] **Step 8: Run tests to verify they pass** + +Run: `./gradlew :countries-core:jvmTest` +Expected: All tests pass. + +- [ ] **Step 9: Commit** + +```bash +git add countries-core/src/commonMain/kotlin/org/kimplify/countries/dsl/CountriesQuery.kt \ + countries-core/src/commonTest/kotlin/org/kimplify/countries/dsl/CountriesQueryTest.kt +git commit -m "feat: Iterable query result, @DslMarker, not{} combinator, fix empty or{}/nameContains edge cases" +``` + +--- + +### Task 12: Update sample app + +**Files:** +- Modify: `sample/src/commonMain/kotlin/org/kimplify/sample/App.kt` + +- [ ] **Step 1: Update language count** + +At line 142, change: +```kotlin +InfoItem("Languages", "7") +``` +to: +```kotlin +InfoItem("Languages", "14") +``` + +- [ ] **Step 2: Add new country fields to `CountryDetailsDialog`** + +In the `CountryDetailsDialog` composable (around line 256), add detail rows for the new fields after the existing rows: + +```kotlin +DetailRow("Continent", country.continent.name.lowercase().replaceFirstChar { it.uppercase() }.replace('_', ' ')) +DetailRow("Region", country.region.name.lowercase().replaceFirstChar { it.uppercase() }.replace('_', ' ')) +DetailRow("Calling Code", country.callingCode.value) +DetailRow("Currency", country.currency.value) +DetailRow("Timezone", country.timezone.value) +``` + +- [ ] **Step 3: Add new languages to locale picker** + +In the `CountriesScreen` composable, find the language dropdown options and add the new locales (JA, PT, HI, KO, IT, TR, ID) following the existing pattern. + +- [ ] **Step 4: Verify the sample compiles** + +Run: `./gradlew :sample:jvmJar` +Expected: Compiles successfully. + +- [ ] **Step 5: Commit** + +```bash +git add sample/src/commonMain/kotlin/org/kimplify/sample/App.kt +git commit -m "feat: update sample app with new country fields and 14 language support" +``` + +--- + +### Task 13: Final test pass across all platforms + +- [ ] **Step 1: Run all JVM tests** + +Run: `./gradlew :countries-core:jvmTest :countries-i18n:jvmTest` +Expected: All tests pass. + +- [ ] **Step 2: Run JS tests** + +Run: `./gradlew :countries-core:jsTest :countries-i18n:jsTest` +Expected: All tests pass. + +- [ ] **Step 3: Run WasmJS tests** + +Run: `./gradlew :countries-core:wasmJsTest :countries-i18n:wasmJsTest` +Expected: All tests pass. + +- [ ] **Step 4: Run iOS simulator tests (if on macOS)** + +Run: `./gradlew :countries-core:iosSimulatorArm64Test :countries-i18n:iosSimulatorArm64Test` +Expected: All tests pass. + +- [ ] **Step 5: Verify the full build** + +Run: `./gradlew build` +Expected: Clean build with no errors. + +- [ ] **Step 6: Final commit if any fixes were needed** + +```bash +git add -A +git commit -m "fix: address issues found during cross-platform test pass" +``` diff --git a/docs/superpowers/specs/2026-03-24-kcountries-full-sweep-design.md b/docs/superpowers/specs/2026-03-24-kcountries-full-sweep-design.md new file mode 100644 index 0000000..bb84ee0 --- /dev/null +++ b/docs/superpowers/specs/2026-03-24-kcountries-full-sweep-design.md @@ -0,0 +1,335 @@ +# KCountries Full Sweep — Design Spec + +**Date:** 2026-03-24 +**Approach:** Fix → Extend → Polish (4 sprints) + +--- + +## Sprint 1: Critical Bug Fixes & Stability + +> Goal: Get the foundation solid — working CI, correct data, proper validation. + +### 1.1 — Fix CI workflows (`build.yml` and `publish.yml`) + +- Replace all `:deci:*` Gradle task references in `build.yml` with correct module paths: + - `:countries-core:jvmTest`, `:countries-core:iosSimulatorArm64Test`, `:countries-core:jsTest`, `:countries-core:wasmJsTest` + - `:countries-i18n:jvmTest`, `:countries-i18n:iosSimulatorArm64Test`, `:countries-i18n:jsTest`, `:countries-i18n:wasmJsTest` +- Standardize on `actions/checkout@v6` in **both** `build.yml` and `publish.yml` (both currently use v5) +- Fix artifact upload paths to reference the correct module build directories + +### 1.2 — Build-generated `Countries.VERSION` + +- Add a Gradle task in `countries-core/build.gradle.kts` that reads the version from `libs.versions.toml` +- Generate a `BuildKConfig.kt` (or similar) source file containing `const val VERSION` +- Remove the hardcoded `const val VERSION = "1.0.0"` from `Countries.kt` +- The generated file should be added to the `commonMain` source set so it's available on all platforms + +### 1.3 — Fix `FlagEmoji` validation + +- Use the already-declared `kotlin-codepoints` dependency to validate flag emojis properly +- Validate that the value consists of exactly 2 Unicode regional indicator codepoints (U+1F1E6..U+1F1FF) +- This rejects `"ABCD"` (4 ASCII chars, length=4) while accepting real flag emojis like `"🇺🇸"` (2 surrogate pairs, length=4) + +### 1.4 — Fix Kosovo translation inconsistency + +- Remove `"XK"` entries from all 6 translation maps (ES, FR, DE, AR, ZH, RU) +- Kosovo (XK) is a user-assigned code, not official ISO 3166-1 — translations should match the dataset + +### 1.5 — Fix country data inaccuracies + +| Country | Field | Current | Fixed | +|---------|-------|---------|-------| +| Turkey | `name` | `"Turkey"` | `"Türkiye"` | +| Turkey | `displayName` | not set | `"Türkiye"` | +| Belgium | `native` | `"Belgien"` | `"België / Belgique"` | +| Peru | `native` | `"Piruw"` | `"Perú"` | + +### 1.6 — Fix `compileSdk` and `minSdk` mismatch + +- Change `countries-core/build.gradle.kts` and `countries-i18n/build.gradle.kts` to use `libs.versions.android.compileSdk` (36) instead of hardcoded `35` +- Change both modules to use `libs.versions.android.minSdk` (24) instead of hardcoded `21`, matching the version catalog and sample app + +### 1.7 — Verify `kotlin-codepoints` is used after 1.3 + +- After 1.3, the dependency should be actively used for `FlagEmoji` validation +- Verify the import is present and the dependency is not dead weight +- If for any reason it's not wired up, remove it from `build.gradle.kts` + +### 1.8 — Fix `Locale` annotation inconsistency + +- Change `@kotlin.jvm.JvmInline` in `Locale.kt` to use the import form `@JvmInline`, consistent with `CountryCodes.kt` + +--- + +## Sprint 2: Extend the Country Model + +> Goal: Add region, calling code, currency, and timezone data to every country. + +### 2.1 — Add new value types + +Create new value/enum types in `countries-core`: + +```kotlin +enum class Continent { + AFRICA, ANTARCTICA, ASIA, EUROPE, NORTH_AMERICA, OCEANIA, SOUTH_AMERICA +} + +enum class Region { + // ~22 values following UN geoscheme + CARIBBEAN, CENTRAL_AMERICA, CENTRAL_ASIA, EASTERN_AFRICA, EASTERN_ASIA, + EASTERN_EUROPE, MELANESIA, MICRONESIA, MIDDLE_AFRICA, NORTHERN_AFRICA, + NORTHERN_AMERICA, NORTHERN_EUROPE, POLYNESIA, SOUTH_AMERICA, SOUTHEASTERN_ASIA, + SOUTHERN_AFRICA, SOUTHERN_ASIA, SOUTHERN_EUROPE, WESTERN_AFRICA, WESTERN_ASIA, + WESTERN_EUROPE, AUSTRALIA_AND_NEW_ZEALAND, ANTARCTICA +} + +@JvmInline +value class CallingCode(val value: String) { + init { require(value.matches(PATTERN)) { "Calling code must be '+' followed by 1-4 digits (base E.164 code, e.g. \"+1\")" } } + companion object { + private val PATTERN = Regex("^\\+\\d{1,4}$") + } +} + +@JvmInline +value class CurrencyCode(val value: String) { + init { require(value.matches(PATTERN)) { "Currency code must be 3 uppercase letters (ISO 4217)" } } + companion object { + private val PATTERN = Regex("^[A-Z]{3}$") + } +} + +@JvmInline +value class TimezoneId(val value: String) { + init { require(value.contains("/") || value == "UTC") { "Timezone must be IANA format (e.g. \"America/New_York\") or \"UTC\"" } } +} +``` + +### 2.2 — Extend `Country` data class + +Add new fields to the `Country` data class. Update KDoc with `@property` entries for all new fields. + +**Breaking change note:** This adds 5 non-optional fields, which is a binary-breaking change for consumers constructing `Country` directly. Acceptable at version 0.x — document in release notes. + +```kotlin +data class Country( + val alpha2: Alpha2Code, + val alpha3: Alpha3Code, + val numeric: NumericCode, + val name: CountryName, + val flag: FlagEmoji, + val displayName: String? = null, + val native: String? = null, + // New fields: + val continent: Continent, + val region: Region, + val callingCode: CallingCode, + val currency: CurrencyCode, + val timezone: TimezoneId +) +``` + +### 2.3 — Populate `CountriesData` with new fields + +- Update all 249 country entries in `CountriesData.kt` with correct continent, region, calling code, currency, and primary timezone data +- Data sources: ISO 4217 (currencies), ITU-T E.164 (calling codes), UN M49 (regions), IANA (timezones) +- **Note:** This is the largest single task (~1,245 data points). Work by continent for manageable chunks and cross-reference against authoritative sources. +- Calling codes use the base E.164 country code with `+` prefix (e.g., `"+1"` for US/Canada, not `"+1-684"` for territories) + +### 2.4 — Add repository query support for new fields + +Add to `CountriesRepository` interface: + +```kotlin +fun getByContinent(continent: Continent): List +fun getByRegion(region: Region): List +fun getByCallingCode(callingCode: CallingCode): List +fun getByCurrency(currencyCode: CurrencyCode): List +``` + +Add lazy index maps in `InMemoryCountriesRepository` (which is `internal`) for O(1) lookups. This follows the same pattern as existing `findByAlpha2(Alpha2Code)` — using value types for type safety. + +### 2.5 — Add DSL query predicates for new fields + +Add to `CountriesQuery`: + +```kotlin +fun continent(continent: Continent) +fun region(region: Region) +fun callingCode(code: String) +fun currency(code: String) +fun timezone(id: String) +``` + +### 2.6 — Add extension functions for new fields + +Add `String` extensions for quick access: + +```kotlin +val String.callingCode: String? // alpha2 → calling code +val String.currencyCode: String? // alpha2 → currency code +val String.continent: Continent? // alpha2 → continent +val String.region: Region? // alpha2 → region +val String.timezone: String? // alpha2 → primary timezone +``` + +### 2.7 — Update `Countries.TOTAL_COUNTRIES` and tests + +- Verify `TOTAL_COUNTRIES` is still 249 +- Update `TestCountries` fixture with new fields +- Add tests for all new repository methods, DSL predicates, and extension functions + +--- + +## Sprint 3: Complete i18n + +> Goal: Fill in all missing translations, add new languages, fix locale handling. + +### 3.1 — Complete Chinese (ZH) translations + +- After Step 1.4 removes the orphaned XK entry, the file will have 244 valid entries +- Add the 5 missing country translations: CN, HK, MO, SG, TW +- Bring the count from 244 to 249 (matching the full dataset) + +### 3.2 — Add Japanese (JA) translations + +- Create `JapaneseTranslations.kt` with all 249 country name translations +- `Locale.JA` constant already exists in `Locale.kt` — verify it's present +- Register in `CountryTranslations` map + +### 3.3 — Add Portuguese (PT) translations + +- Create `PortugueseTranslations.kt` with all 249 country name translations +- `Locale.PT` constant already exists in `Locale.kt` — verify it's present +- Register in `CountryTranslations` map + +### 3.4 — Add Hindi (HI) translations + +- Create `HindiTranslations.kt` with all 249 country name translations +- `Locale.HI` constant already exists in `Locale.kt` — verify it's present +- Register in `CountryTranslations` map + +### 3.5 — Add Korean (KO) translations + +- Create `KoreanTranslations.kt` with all 249 country name translations +- Add `Locale.KO` constant +- Register in `CountryTranslations` map + +### 3.6 — Add Italian (IT) translations + +- Create `ItalianTranslations.kt` with all 249 country name translations +- Add `Locale.IT` constant +- Register in `CountryTranslations` map + +### 3.7 — Add Turkish (TR) translations + +- Create `TurkishTranslations.kt` with all 249 country name translations +- Add `Locale.TR` constant +- Register in `CountryTranslations` map + +### 3.8 — Add Indonesian (ID) translations + +- Create `IndonesianTranslations.kt` with all 249 country name translations +- Add `Locale.ID` constant +- Register in `CountryTranslations` map + +### 3.9 — Fix locale string handling + +- Keep `Locale` value class strict (exactly 2 lowercase letters) +- In `getLocalizedName(String)`: normalize input by extracting language part and lowercasing + - `"en-US"` → `"en"`, `"EN"` → `"en"`, `"pt_BR"` → `"pt"`, `"english"` → reject gracefully (return fallback, not crash) +- Return `getDisplayName()` as fallback instead of throwing `IllegalArgumentException` + +### 3.10 — Update translation tests + +- Update the `translatedCount >= 245` assertion to be exact per locale +- Add tests for each new language +- Add test for locale string normalization edge cases +- Update sample app `InfoItem("Languages", "7")` to reflect actual count: 13 translation maps (ES, FR, DE, AR, ZH, RU + JA, PT, HI, KO, IT, TR, ID) plus EN fallback = 14 supported locales total + +--- + +## Sprint 4: API Improvements & Polish + +> Goal: Round out the API, fix inconsistencies, improve developer experience. + +### 4.1 — Make `CountriesQueryResult` implement `Iterable` + +```kotlin +class CountriesQueryResult internal constructor( + private val countries: List +) : Iterable { + override fun iterator() = countries.iterator() + // ... existing methods +} +``` + +This enables `for (country in result)`, `.map {}`, `.filter {}`, etc. + +### 4.2 — Add `@DslMarker` to query DSL + +```kotlin +@DslMarker +annotation class CountriesDsl + +@CountriesDsl +class CountriesQuery { ... } +``` + +Prevents accidentally calling outer-scope DSL functions from inside `or {}` blocks. + +### 4.3 — Add `not {}` DSL combinator + +Uses `!any` semantics — "none of these predicates match". This means `not { continent(ANTARCTICA); region(EASTERN_EUROPE) }` excludes countries matching Antarctica **or** Eastern Europe, which is the intuitive reading. + +```kotlin +fun not(block: CountriesQuery.() -> Unit) { + val subQuery = CountriesQuery(repository) + subQuery.block() + predicates.add { country -> + !subQuery.predicates.any { it(country) } + } +} +``` + +Enables queries like: `query { not { continent(ANTARCTICA) } }` + +### 4.4 — Fix `searchByName("")` vs `nameContains("")` inconsistency + +- `searchByName("")` returns empty list; `nameContains("")` matches all 249 countries. These should be consistent. +- Decision: `nameContains("")` should be a **no-op** — if the name is blank, skip adding the predicate entirely. This means "no filter applied", so all countries pass through (same as not calling `nameContains` at all). +- This differs from `searchByName("")` which returns empty. Update `searchByName` to also return all countries for blank input (consistent "no filter" semantics), or document the difference: `searchByName` is "search for X" (blank = no results), `nameContains` is "filter by X" (blank = no filter). +- Chosen approach: make `nameContains("")` a no-op. `searchByName("")` remains empty (it's a different API with "search" semantics). Document this distinction. + +### 4.5 — Guard `or {}` empty block edge case + +- If `or {}` is called with an empty block (no predicates), don't add the always-false predicate +- Add a guard: `if (subQuery.predicates.isEmpty()) return` +- Add a test for this edge case + +### 4.6 — Update sample app + +- Fix hardcoded `InfoItem("Languages", "7")` → `"14"` (13 translation maps + EN fallback) +- Add UI for new country fields (continent, calling code, currency, timezone) +- Add new languages to the language picker + +### 4.7 — Final test pass + +- Run all tests across all platforms (JVM, iOS, JS, WasmJS) +- Verify CI workflow runs successfully +- Verify all 249 countries have complete data for all new fields +- Verify all 13 translation locales have complete translations (249 entries each) + +--- + +## Decisions Log + +| Decision | Choice | Rationale | +|----------|--------|-----------| +| New data fields location | All in `Country` data class | Simple API, minimal size overhead, no module sprawl | +| Missing translations | Add all + new languages (KO, IT, TR, ID) | Deliver on promised locales, expand coverage | +| Region granularity | Continent + Region (UN geoscheme) | Good balance of utility vs. complexity | +| Multi-value fields (calling code, currency) | Primary only | Covers 95% of use cases, clean API | +| Locale string handling | Normalize in convenience API, keep `Locale` strict | Type safety preserved, string API forgiving | +| Version constant | Build-generated from `libs.versions.toml` | Zero maintenance, always in sync | +| Execution approach | Fix → Extend → Polish (4 sprints) | Bugs fixed first, new features build on solid base | diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f793e3c..1d79090 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,15 +7,15 @@ android-compileSdk = "36" android-minSdk = "24" android-targetSdk = "36" -androidx-activity = "1.12.2" -androidx-lifecycle = "2.9.6" -composeMultiplatform = "1.10.0-rc02" +androidx-activity = "1.13.0" +androidx-lifecycle = "2.10.0" +composeMultiplatform = "1.11.0-alpha04" junit = "4.13.2" -kotlin = "2.2.21" +kotlin = "2.3.20" kotlinx-coroutines = "1.10.2" composeBom = "2025.12.01" kotlinCodepoints = "0.11.0" -maven-publish = "0.35.0" +maven-publish = "0.36.0" [libraries] diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index d7f7925..5e4f71a 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -113,6 +113,134 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== +"@noble/hashes@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@peculiar/asn1-cms@^2.6.0", "@peculiar/asn1-cms@^2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz#cb5445c1bad9197d176073bf142a5c035b460640" + integrity sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw== + dependencies: + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.1" + "@peculiar/asn1-x509-attr" "^2.6.1" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-csr@^2.6.0": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz#9629d403bc5a61254f28ed0b90e99cee61c0e8be" + integrity sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w== + dependencies: + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.1" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-ecc@^2.6.0": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz#d29c4af671508a9934edc78e7c9419fbf7bc9870" + integrity sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g== + dependencies: + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.1" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-pfx@^2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz#75cddd14d43ef875109e91ea150377d679c8fbc1" + integrity sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw== + dependencies: + "@peculiar/asn1-cms" "^2.6.1" + "@peculiar/asn1-pkcs8" "^2.6.1" + "@peculiar/asn1-rsa" "^2.6.1" + "@peculiar/asn1-schema" "^2.6.0" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-pkcs8@^2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz#bd56b4bb9e8a3702369049713a89134c87c6931a" + integrity sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw== + dependencies: + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.1" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-pkcs9@^2.6.0": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz#ddc5222952f25b59a0562a6f8cabdb72f586a496" + integrity sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw== + dependencies: + "@peculiar/asn1-cms" "^2.6.1" + "@peculiar/asn1-pfx" "^2.6.1" + "@peculiar/asn1-pkcs8" "^2.6.1" + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.1" + "@peculiar/asn1-x509-attr" "^2.6.1" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-rsa@^2.6.0", "@peculiar/asn1-rsa@^2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz#2cdf9f9ea6d6fdbaae214b9fed6de0534b654437" + integrity sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA== + dependencies: + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.1" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-schema@^2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz#0dca1601d5b0fed2a72fed7a5f1d0d7dbe3a6f82" + integrity sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg== + dependencies: + asn1js "^3.0.6" + pvtsutils "^1.3.6" + tslib "^2.8.1" + +"@peculiar/asn1-x509-attr@^2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz#6425008b8099476010aace5b8ae9f9cbc41db0ab" + integrity sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ== + dependencies: + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.1" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-x509@^2.6.0", "@peculiar/asn1-x509@^2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz#4e8995659e16178e0e90fe90519aa269045af262" + integrity sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA== + dependencies: + "@peculiar/asn1-schema" "^2.6.0" + asn1js "^3.0.6" + pvtsutils "^1.3.6" + tslib "^2.8.1" + +"@peculiar/x509@^1.14.2": + version "1.14.3" + resolved "https://registry.yarnpkg.com/@peculiar/x509/-/x509-1.14.3.tgz#2c44c2b89474346afec38a0c2803ec4fb8ce959e" + integrity sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA== + dependencies: + "@peculiar/asn1-cms" "^2.6.0" + "@peculiar/asn1-csr" "^2.6.0" + "@peculiar/asn1-ecc" "^2.6.0" + "@peculiar/asn1-pkcs9" "^2.6.0" + "@peculiar/asn1-rsa" "^2.6.0" + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.0" + pvtsutils "^1.3.6" + reflect-metadata "^0.2.2" + tslib "^2.8.1" + tsyringe "^4.10.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -210,7 +338,7 @@ "@types/express-serve-static-core" "^5.0.0" "@types/serve-static" "^1" -"@types/express@^4.17.21": +"@types/express@^4.17.25": version "4.17.25" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.25.tgz#070c8c73a6fee6936d65c195dbbfb7da5026649b" integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== @@ -242,13 +370,6 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== -"@types/node-forge@^1.3.0": - version "1.3.14" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.14.tgz#006c2616ccd65550560c2757d8472eb6d3ecea0b" - integrity sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw== - dependencies: - "@types/node" "*" - "@types/node@*", "@types/node@>=10.0.0": version "24.10.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.1.tgz#91e92182c93db8bd6224fca031e2370cef9a8f01" @@ -549,6 +670,15 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +asn1js@^3.0.6: + version "3.0.7" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.7.tgz#15f1f2f59e60f80d5b43ef14047a294a969f824f" + integrity sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ== + dependencies: + pvtsutils "^1.3.6" + pvutils "^1.1.3" + tslib "^2.8.1" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -574,7 +704,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -body-parser@1.20.3, body-parser@^1.19.0: +body-parser@^1.19.0: version "1.20.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== @@ -592,6 +722,24 @@ body-parser@1.20.3, body-parser@^1.19.0: type-is "~1.6.18" unpipe "1.0.0" +body-parser@~1.20.3: + version "1.20.4" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.4.tgz#f8e20f4d06ca8a50a71ed329c15dccad1cdc547f" + integrity sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA== + dependencies: + bytes "~3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "~1.2.0" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + on-finished "~2.4.1" + qs "~6.14.0" + raw-body "~2.5.3" + type-is "~1.6.18" + unpipe "~1.0.0" + bonjour-service@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" @@ -650,11 +798,16 @@ bundle-name@^4.1.0: dependencies: run-applescript "^7.0.0" -bytes@3.1.2: +bytes@3.1.2, bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +bytestreamjs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bytestreamjs/-/bytestreamjs-2.0.1.tgz#a32947c7ce389a6fa11a09a9a563d0a45889535e" + integrity sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ== + call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" @@ -777,7 +930,7 @@ compressible@~2.0.18: dependencies: mime-db ">= 1.43.0 < 2" -compression@^1.7.4: +compression@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== @@ -810,7 +963,7 @@ connect@^3.7.0: parseurl "~1.3.3" utils-merge "1.0.1" -content-disposition@0.5.4: +content-disposition@~0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== @@ -822,17 +975,12 @@ content-type@~1.0.4, content-type@~1.0.5: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== +cookie-signature@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" + integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== -cookie@~0.7.2: +cookie@~0.7.1, cookie@~0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== @@ -913,7 +1061,7 @@ define-lazy-prop@^3.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== -depd@2.0.0: +depd@2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -923,7 +1071,7 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -destroy@1.2.0: +destroy@1.2.0, destroy@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== @@ -1024,13 +1172,13 @@ engine.io@~6.6.0: engine.io-parser "~5.2.1" ws "~8.17.1" -enhanced-resolve@^5.17.2: - version "5.18.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz#9b5f4c5c076b8787c78fe540392ce76a88855b44" - integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== +enhanced-resolve@^5.17.3: + version "5.20.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz#eeeb3966bea62c348c40a0cc9e7912e2557d0be0" + integrity sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA== dependencies: graceful-fs "^4.2.4" - tapable "^2.2.0" + tapable "^2.3.0" ent@~2.2.0: version "2.2.2" @@ -1124,39 +1272,39 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -express@^4.21.2: - version "4.21.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" - integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== +express@^4.22.1: + version "4.22.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.22.1.tgz#1de23a09745a4fffdb39247b344bb5eaff382069" + integrity sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" + body-parser "~1.20.3" + content-disposition "~0.5.4" content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" + cookie "~0.7.1" + cookie-signature "~1.0.6" debug "2.6.9" depd "2.0.0" encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" + finalhandler "~1.3.1" + fresh "~0.5.2" + http-errors "~2.0.0" merge-descriptors "1.0.3" methods "~1.1.2" - on-finished "2.4.1" + on-finished "~2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.12" + path-to-regexp "~0.1.12" proxy-addr "~2.0.7" - qs "6.13.0" + qs "~6.14.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" + send "~0.19.0" + serve-static "~1.16.2" setprototypeof "1.2.0" - statuses "2.0.1" + statuses "~2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -1208,17 +1356,17 @@ finalhandler@1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== +finalhandler@~1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" + integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== dependencies: debug "2.6.9" encodeurl "~2.0.0" escape-html "~1.0.3" - on-finished "2.4.1" + on-finished "~2.4.1" parseurl "~1.3.3" - statuses "2.0.1" + statuses "~2.0.2" unpipe "~1.0.0" find-up@^4.0.0: @@ -1270,7 +1418,7 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fresh@0.5.2: +fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== @@ -1449,6 +1597,17 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-errors@~2.0.0, http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== + dependencies: + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" + http-parser-js@>=0.5.1: version "0.5.10" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.10.tgz#b3277bd6d7ed5588e20ea73bf724fcbe44609075" @@ -1479,7 +1638,7 @@ hyperdyperid@^1.2.0: resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== -iconv-lite@0.4.24: +iconv-lite@0.4.24, iconv-lite@~0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -1509,7 +1668,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1587,6 +1746,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" @@ -1718,10 +1882,9 @@ karma-webpack@5.0.1: minimatch "^9.0.3" webpack-merge "^4.1.5" -karma@6.4.4: +"karma@github:Kotlin/karma#6.4.5": version "6.4.4" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.4.tgz#dfa5a426cf5a8b53b43cd54ef0d0d09742351492" - integrity sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w== + resolved "https://codeload.github.com/Kotlin/karma/tar.gz/239a8fc984584f0d96b1dd750e7a5e2c79da93a6" dependencies: "@colors/colors" "1.5.0" body-parser "^1.19.0" @@ -1753,10 +1916,10 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -kotlin-web-helpers@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/kotlin-web-helpers/-/kotlin-web-helpers-2.1.0.tgz#6cd4b0f0dc3baea163929c8638155b8d19c55a74" - integrity sha512-NAJhiNB84tnvJ5EQx7iER3GWw7rsTZkX9HVHZpe7E3dDBD/dhTzqgSwNU3MfQjniy2rB04bP24WM9Z32ntUWRg== +kotlin-web-helpers@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/kotlin-web-helpers/-/kotlin-web-helpers-3.0.0.tgz#3ed6b48f694f74bb60a737a9d7e2c0e3b29abdb9" + integrity sha512-kdQO4AJQkUPvpLh9aglkXDRyN+CfXO7pKq+GESEnxooBFkQpytLrqZis3ABvmFN1cGw/ZQ/K38u5sRGW+NfBnw== dependencies: format-util "^1.0.5" @@ -1931,10 +2094,10 @@ mkdirp@^0.5.5: dependencies: minimist "^1.2.6" -mocha@11.7.1: - version "11.7.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.1.tgz#91948fecd624fb4bd154ed260b7e1ad3910d7c7a" - integrity sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A== +mocha@11.7.5: + version "11.7.5" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.5.tgz#58f5bbfa5e0211ce7e5ee6128107cefc2515a627" + integrity sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig== dependencies: browser-stdout "^1.3.1" chokidar "^4.0.1" @@ -1944,6 +2107,7 @@ mocha@11.7.1: find-up "^5.0.0" glob "^10.4.5" he "^1.2.0" + is-path-inside "^3.0.3" js-yaml "^4.1.0" log-symbols "^4.1.0" minimatch "^9.0.5" @@ -1990,11 +2154,6 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -node-forge@^1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.2.tgz#d0d2659a26eef778bf84d73e7f55c08144ee7750" - integrity sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw== - node-releases@^2.0.27: version "2.0.27" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" @@ -2020,7 +2179,7 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@2.4.1, on-finished@^2.4.1: +on-finished@2.4.1, on-finished@^2.4.1, on-finished@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -2136,7 +2295,7 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-to-regexp@0.1.12: +path-to-regexp@~0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== @@ -2158,6 +2317,18 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pkijs@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pkijs/-/pkijs-3.4.0.tgz#d9164def30ff6d97be2d88966d5e36192499ca9c" + integrity sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw== + dependencies: + "@noble/hashes" "1.4.0" + asn1js "^3.0.6" + bytestreamjs "^2.0.1" + pvtsutils "^1.3.6" + pvutils "^1.1.3" + tslib "^2.8.1" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -2176,6 +2347,18 @@ punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== +pvtsutils@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.6.tgz#ec46e34db7422b9e4fdc5490578c1883657d6001" + integrity sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg== + dependencies: + tslib "^2.8.1" + +pvutils@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.5.tgz#84b0dea4a5d670249aa9800511804ee0b7c2809c" + integrity sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA== + qjobs@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" @@ -2188,6 +2371,13 @@ qs@6.13.0: dependencies: side-channel "^1.0.6" +qs@~6.14.0: + version "6.14.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.2.tgz#b5634cf9d9ad9898e31fba3504e866e8efb6798c" + integrity sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q== + dependencies: + side-channel "^1.1.0" + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -2210,6 +2400,16 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@~2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" + integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== + dependencies: + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + unpipe "~1.0.0" + readable-stream@^2.0.1: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -2251,6 +2451,11 @@ rechoir@^0.8.0: dependencies: resolve "^1.20.0" +reflect-metadata@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -2348,32 +2553,32 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -selfsigned@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" - integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== +selfsigned@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-5.5.0.tgz#4c9ab7c7c9f35f18fb6a9882c253eb0e6bd6557b" + integrity sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew== dependencies: - "@types/node-forge" "^1.3.0" - node-forge "^1" + "@peculiar/x509" "^1.14.2" + pkijs "^3.3.3" -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== +send@~0.19.0, send@~0.19.1: + version "0.19.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" + integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== dependencies: debug "2.6.9" depd "2.0.0" destroy "1.2.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" + fresh "~0.5.2" + http-errors "~2.0.1" mime "1.6.0" ms "2.1.3" - on-finished "2.4.1" + on-finished "~2.4.1" range-parser "~1.2.1" - statuses "2.0.1" + statuses "~2.0.2" serialize-javascript@^6.0.2: version "6.0.2" @@ -2395,22 +2600,22 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== +serve-static@~1.16.2: + version "1.16.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" + integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== dependencies: encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.19.0" + send "~0.19.1" setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -setprototypeof@1.2.0: +setprototypeof@1.2.0, setprototypeof@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== @@ -2468,7 +2673,7 @@ side-channel-weakmap@^1.0.2: object-inspect "^1.13.3" side-channel-map "^1.0.1" -side-channel@^1.0.6: +side-channel@^1.0.6, side-channel@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== @@ -2581,6 +2786,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@~2.0.1, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + streamroller@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" @@ -2660,11 +2870,16 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== +tapable@^2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.2.tgz#86755feabad08d82a26b891db044808c6ad00f15" + integrity sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA== + terser-webpack-plugin@^5.3.11: version "5.3.14" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" @@ -2708,7 +2923,7 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -toidentifier@1.0.1: +toidentifier@1.0.1, toidentifier@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== @@ -2718,11 +2933,23 @@ tree-dump@^1.0.3, tree-dump@^1.1.0: resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4" integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== -tslib@^2.0.0: +tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== +tsyringe@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/tsyringe/-/tsyringe-4.10.0.tgz#d0c95815d584464214060285eaaadd94aa03299c" + integrity sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw== + dependencies: + tslib "^1.9.3" + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -2830,14 +3057,14 @@ webpack-dev-middleware@^7.4.2: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz#96a143d50c58fef0c79107e61df911728d7ceb39" - integrity sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg== +webpack-dev-server@5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz#7f36a78be7ac88833fd87757edee31469a9e47d3" + integrity sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ== dependencies: "@types/bonjour" "^3.5.13" "@types/connect-history-api-fallback" "^1.5.4" - "@types/express" "^4.17.21" + "@types/express" "^4.17.25" "@types/express-serve-static-core" "^4.17.21" "@types/serve-index" "^1.9.4" "@types/serve-static" "^1.15.5" @@ -2847,9 +3074,9 @@ webpack-dev-server@5.2.2: bonjour-service "^1.2.1" chokidar "^3.6.0" colorette "^2.0.10" - compression "^1.7.4" + compression "^1.8.1" connect-history-api-fallback "^2.0.0" - express "^4.21.2" + express "^4.22.1" graceful-fs "^4.2.6" http-proxy-middleware "^2.0.9" ipaddr.js "^2.1.0" @@ -2857,7 +3084,7 @@ webpack-dev-server@5.2.2: open "^10.0.3" p-retry "^6.2.0" schema-utils "^4.2.0" - selfsigned "^2.4.1" + selfsigned "^5.5.0" serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" @@ -2885,10 +3112,10 @@ webpack-sources@^3.3.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== -webpack@5.100.2: - version "5.100.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.100.2.tgz#e2341facf9f7de1d702147c91bcb65b693adf9e8" - integrity sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw== +webpack@5.101.3: + version "5.101.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.101.3.tgz#3633b2375bb29ea4b06ffb1902734d977bc44346" + integrity sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.8" @@ -2900,7 +3127,7 @@ webpack@5.100.2: acorn-import-phases "^1.0.3" browserslist "^4.24.0" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.2" + enhanced-resolve "^5.17.3" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" diff --git a/sample/src/commonMain/kotlin/org/kimplify/sample/App.kt b/sample/src/commonMain/kotlin/org/kimplify/sample/App.kt index 4b6189a..7b4d772 100644 --- a/sample/src/commonMain/kotlin/org/kimplify/sample/App.kt +++ b/sample/src/commonMain/kotlin/org/kimplify/sample/App.kt @@ -78,7 +78,14 @@ fun CountriesScreen() { Locale.DE to "Deutsch", Locale.AR to "العربية", Locale.ZH to "中文", - Locale.RU to "Русский" + Locale.RU to "Русский", + Locale.JA to "日本語", + Locale.PT to "Português", + Locale.HI to "हिन्दी", + Locale.KO to "한국어", + Locale.IT to "Italiano", + Locale.TR to "Türkçe", + Locale.ID to "Bahasa Indonesia" ).forEach { (locale, name) -> DropdownMenuItem( text = { @@ -139,7 +146,7 @@ fun CountriesScreen() { InfoItem("Version", Countries.VERSION) InfoItem("Total", Countries.TOTAL_COUNTRIES.toString()) InfoItem("Shown", filteredCountries.size.toString()) - InfoItem("Languages", "7") + InfoItem("Languages", "14") } } } @@ -290,6 +297,11 @@ fun CountryDetailsDialog( DetailRow("ISO Alpha-2", country.alpha2.value) DetailRow("ISO Alpha-3", country.alpha3.value) DetailRow("Numeric Code", country.numeric.value) + DetailRow("Continent", country.continent.name.lowercase().replaceFirstChar { it.uppercase() }.replace('_', ' ')) + DetailRow("Region", country.region.name.lowercase().replaceFirstChar { it.uppercase() }.replace('_', ' ')) + DetailRow("Calling Code", country.callingCode.value) + DetailRow("Currency", country.currency.value) + DetailRow("Timezone", country.timezone.value) if (country.displayName != null) { DetailRow("Display Name", country.displayName!!)