diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/components/locale_emoji/LocaleEmoji.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/components/locale_emoji/LocaleEmoji.kt new file mode 100644 index 0000000..55d02f0 --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/components/locale_emoji/LocaleEmoji.kt @@ -0,0 +1,38 @@ +package com.kaajjo.libresudoku.ui.components.locale_emoji + +import android.util.Log + +object LocaleEmoji { + /** + * Get a country flag from language code + * @return country flag (emoji) + */ + fun getFlagEmoji( + languageCode: String + ): String? { + val countryCode = countryFromLanguage(languageCode) + if (countryCode.isNullOrBlank()) return null + + return countryCodeToEmoji(countryCode) + } + + private fun countryFromLanguage(languageCode: String?): String? { + if (languageCode == null) return null + + return languageCodeToCountryCode[languageCode.lowercase()] + } + + private fun countryCodeToEmoji(countryCode: String): String? { + val uppercaseCode = countryCode.uppercase() + + try { + val firstChar = uppercaseCode[0] - 'A' + 0x1F1E6 + val secondChar = uppercaseCode[1] - 'A' + 0x1F1E6 + val emoji = String(Character.toChars(firstChar)) + String(Character.toChars(secondChar)) + return emoji + } catch (e: IllegalArgumentException) { + Log.e("LocaleEmoji", "Cannot find flag for: $countryCode") + return null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/components/locale_emoji/LocaleMap.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/components/locale_emoji/LocaleMap.kt new file mode 100644 index 0000000..ab534d9 --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/components/locale_emoji/LocaleMap.kt @@ -0,0 +1,766 @@ +package com.kaajjo.libresudoku.ui.components.locale_emoji + +/** + * Map of language codes to country codes (ISO 3166-1 alpha-2) + */ +val languageCodeToCountryCode = mapOf( + "aa" to "ET", + "ab" to "GE", + "abr" to "GH", + "ace" to "ID", + "ach" to "UG", + "ada" to "GH", + "adp" to "BT", + "ady" to "RU", + "ae" to "IR", + "aeb" to "TN", + "af" to "ZA", + "agq" to "CM", + "aho" to "IN", + "ak" to "GH", + "akk" to "IQ", + "aln" to "XK", + "alt" to "RU", + "am" to "ET", + "amo" to "NG", + "an" to "ES", + "aoz" to "ID", + "apd" to "TG", + "ar" to "EG", + "arc" to "IR", + "arc-Nbat" to "JO", + "arc-Palm" to "SY", + "arn" to "CL", + "aro" to "BO", + "arq" to "DZ", + "ars" to "SA", + "ary" to "MA", + "arz" to "EG", + "as" to "IN", + "asa" to "TZ", + "ase" to "US", + "ast" to "ES", + "atj" to "CA", + "av" to "RU", + "awa" to "IN", + "ay" to "BO", + "az" to "AZ", + "az-Arab" to "IR", + "ba" to "RU", + "bal" to "PK", + "ban" to "ID", + "bap" to "NP", + "bar" to "AT", + "bas" to "CM", + "bax" to "CM", + "bbc" to "ID", + "bbj" to "CM", + "bci" to "CI", + "be" to "BY", + "bej" to "SD", + "bem" to "ZM", + "bew" to "ID", + "bez" to "TZ", + "bfd" to "CM", + "bfq" to "IN", + "bft" to "PK", + "bfy" to "IN", + "bg" to "BG", + "bgc" to "IN", + "bgn" to "PK", + "bgx" to "TR", + "bhb" to "IN", + "bhi" to "IN", + "bho" to "IN", + "bi" to "VU", + "bik" to "PH", + "bin" to "NG", + "bjj" to "IN", + "bjn" to "ID", + "bjt" to "SN", + "bkm" to "CM", + "bku" to "PH", + "blt" to "VN", + "bm" to "ML", + "bmq" to "ML", + "bn" to "BD", + "bo" to "CN", + "bpy" to "IN", + "bqi" to "IR", + "bqv" to "CI", + "br" to "FR", + "bra" to "IN", + "brh" to "PK", + "brx" to "IN", + "bs" to "BA", + "bsq" to "LR", + "bss" to "CM", + "bto" to "PH", + "btv" to "PK", + "bua" to "RU", + "buc" to "YT", + "bug" to "ID", + "bum" to "CM", + "bvb" to "GQ", + "byn" to "ER", + "byv" to "CM", + "bze" to "ML", + "ca" to "ES", + "cad" to "US", + "cch" to "NG", + "ccp" to "BD", + "ce" to "RU", + "ceb" to "PH", + "cgg" to "UG", + "ch" to "GU", + "chk" to "FM", + "chm" to "RU", + "cho" to "US", + "chp" to "CA", + "chr" to "US", + "cic" to "US", + "cja" to "KH", + "cjm" to "VN", + "ckb" to "IQ", + "cmg" to "MN", + "co" to "FR", + "cop" to "EG", + "cps" to "PH", + "cr" to "CA", + "crh" to "UA", + "crj" to "CA", + "crk" to "CA", + "crl" to "CA", + "crm" to "CA", + "crs" to "SC", + "cs" to "CZ", + "csb" to "PL", + "csw" to "CA", + "ctd" to "MM", + "cu" to "RU", + "cu-Glag" to "BG", + "cv" to "RU", + "cy" to "GB", + "da" to "DK", + "dak" to "US", + "dar" to "RU", + "dav" to "KE", + "dcc" to "IN", + "de" to "DE", + "den" to "CA", + "dgr" to "CA", + "dje" to "NE", + "dnj" to "CI", + "doi" to "IN", + "drh" to "CN", + "dsb" to "DE", + "dtm" to "ML", + "dtp" to "MY", + "dty" to "NP", + "dua" to "CM", + "dv" to "MV", + "dyo" to "SN", + "dyu" to "BF", + "dz" to "BT", + "ebu" to "KE", + "ee" to "GH", + "efi" to "NG", + "egl" to "IT", + "egy" to "EG", + "eky" to "MM", + "el" to "GR", + "en" to "US", + "en-Shaw" to "GB", + "es" to "ES", + "esg" to "IN", + "esu" to "US", + "et" to "EE", + "ett" to "IT", + "eu" to "ES", + "ewo" to "CM", + "ext" to "ES", + "fa" to "IR", + "fan" to "GQ", + "ff" to "SN", + "ff-Adlm" to "GN", + "ffm" to "ML", + "fi" to "FI", + "fia" to "SD", + "fil" to "PH", + "fit" to "SE", + "fj" to "FJ", + "fo" to "FO", + "fon" to "BJ", + "fr" to "FR", + "frc" to "US", + "frp" to "FR", + "frr" to "DE", + "frs" to "DE", + "fub" to "CM", + "fud" to "WF", + "fuf" to "GN", + "fuq" to "NE", + "fur" to "IT", + "fuv" to "NG", + "fvr" to "SD", + "fy" to "NL", + "ga" to "IE", + "gaa" to "GH", + "gag" to "MD", + "gan" to "CN", + "gay" to "ID", + "gbm" to "IN", + "gbz" to "IR", + "gcr" to "GF", + "gd" to "GB", + "gez" to "ET", + "ggn" to "NP", + "gil" to "KI", + "gjk" to "PK", + "gju" to "PK", + "gl" to "ES", + "glk" to "IR", + "gn" to "PY", + "gom" to "IN", + "gon" to "IN", + "gor" to "ID", + "gos" to "NL", + "got" to "UA", + "grc" to "CY", + "grc-Linb" to "GR", + "grt" to "IN", + "gsw" to "CH", + "gu" to "IN", + "gub" to "BR", + "guc" to "CO", + "gur" to "GH", + "guz" to "KE", + "gv" to "IM", + "gvr" to "NP", + "gwi" to "CA", + "ha" to "NG", + "hak" to "CN", + "haw" to "US", + "haz" to "AF", + "he" to "IL", + "hi" to "IN", + "hi-Latn" to "IN", + "hif" to "FJ", + "hil" to "PH", + "hlu" to "TR", + "hmd" to "CN", + "hnd" to "PK", + "hne" to "IN", + "hnj" to "LA", + "hnn" to "PH", + "hno" to "PK", + "ho" to "PG", + "hoc" to "IN", + "hoj" to "IN", + "hr" to "HR", + "hsb" to "DE", + "hsn" to "CN", + "ht" to "HT", + "hu" to "HU", + "hy" to "AM", + "hz" to "NA", + "iba" to "MY", + "ibb" to "NG", + "id" to "ID", + "ife" to "TG", + "ig" to "NG", + "ii" to "CN", + "ik" to "US", + "ikt" to "CA", + "ilo" to "PH", + "in" to "ID", + "inh" to "RU", + "is" to "IS", + "it" to "IT", + "iu" to "CA", + "iw" to "IL", + "izh" to "RU", + "ja" to "JP", + "jam" to "JM", + "jgo" to "CM", + "ji" to "UA", + "jmc" to "TZ", + "jml" to "NP", + "jut" to "DK", + "jv" to "ID", + "jw" to "ID", + "ka" to "GE", + "kaa" to "UZ", + "kab" to "DZ", + "kac" to "MM", + "kaj" to "NG", + "kam" to "KE", + "kao" to "ML", + "kbd" to "RU", + "kby" to "NE", + "kcg" to "NG", + "kck" to "ZW", + "kde" to "TZ", + "kdh" to "TG", + "kdt" to "TH", + "kea" to "CV", + "ken" to "CM", + "kfo" to "CI", + "kfr" to "IN", + "kfy" to "IN", + "kg" to "CD", + "kge" to "ID", + "kgp" to "BR", + "kha" to "IN", + "khb" to "CN", + "khn" to "IN", + "khq" to "ML", + "kht" to "IN", + "khw" to "PK", + "ki" to "KE", + "kiu" to "TR", + "kj" to "NA", + "kjg" to "LA", + "kk" to "KZ", + "kk-Arab" to "CN", + "kkj" to "CM", + "kl" to "GL", + "kln" to "KE", + "km" to "KH", + "kmb" to "AO", + "kn" to "IN", + "knf" to "GW", + "ko" to "KR", + "koi" to "RU", + "kok" to "IN", + "kos" to "FM", + "kpe" to "LR", + "krc" to "RU", + "kri" to "SL", + "krj" to "PH", + "krl" to "RU", + "kru" to "IN", + "ks" to "IN", + "ks-Deva" to "IN", + "ksb" to "TZ", + "ksf" to "CM", + "ksh" to "DE", + "ktr" to "MY", + "ku" to "TR", + "ku-Arab" to "IQ", + "ku-Yezi" to "GE", + "kum" to "RU", + "kv" to "RU", + "kvr" to "ID", + "kvx" to "PK", + "kw" to "GB", + "kxm" to "TH", + "kxp" to "PK", + "ky" to "KG", + "ky-Arab" to "CN", + "ky-Latn" to "TR", + "kzj" to "MY", + "kzt" to "MY", + "la" to "VA", + "lab" to "GR", + "lad" to "IL", + "lag" to "TZ", + "lah" to "PK", + "laj" to "UG", + "lb" to "LU", + "lbe" to "RU", + "lbw" to "ID", + "lcp" to "CN", + "lep" to "IN", + "lez" to "RU", + "lg" to "UG", + "li" to "NL", + "lif" to "NP", + "lif-Limb" to "IN", + "lij" to "IT", + "lis" to "CN", + "ljp" to "ID", + "lki" to "IR", + "lkt" to "US", + "lmn" to "IN", + "lmo" to "IT", + "ln" to "CD", + "lo" to "LA", + "lol" to "CD", + "loz" to "ZM", + "lrc" to "IR", + "lt" to "LT", + "ltg" to "LV", + "lu" to "CD", + "lua" to "CD", + "luo" to "KE", + "luy" to "KE", + "luz" to "IR", + "lv" to "LV", + "lwl" to "TH", + "lzh" to "CN", + "lzz" to "TR", + "mad" to "ID", + "maf" to "CM", + "mag" to "IN", + "mai" to "IN", + "mak" to "ID", + "man" to "GM", + "man-Nkoo" to "GN", + "mas" to "KE", + "maz" to "MX", + "mdf" to "RU", + "mdh" to "PH", + "mdr" to "ID", + "men" to "SL", + "mer" to "KE", + "mfa" to "TH", + "mfe" to "MU", + "mg" to "MG", + "mgh" to "MZ", + "mgo" to "CM", + "mgp" to "NP", + "mgy" to "TZ", + "mh" to "MH", + "mi" to "NZ", + "min" to "ID", + "mis" to "IQ", + "mis-Medf" to "NG", + "mk" to "MK", + "ml" to "IN", + "mls" to "SD", + "mn" to "MN", + "mn-Mong" to "CN", + "mni" to "IN", + "mnw" to "MM", + "mo" to "RO", + "moe" to "CA", + "moh" to "CA", + "mos" to "BF", + "mr" to "IN", + "mrd" to "NP", + "mrj" to "RU", + "mro" to "BD", + "ms" to "MY", + "mt" to "MT", + "mtr" to "IN", + "mua" to "CM", + "mus" to "US", + "mvy" to "PK", + "mwk" to "ML", + "mwr" to "IN", + "mwv" to "ID", + "mww" to "US", + "mxc" to "ZW", + "my" to "MM", + "myv" to "RU", + "myx" to "UG", + "myz" to "IR", + "mzn" to "IR", + "na" to "NR", + "nan" to "CN", + "nap" to "IT", + "naq" to "NA", + "nb" to "NO", + "nb-no" to "NO", + "nch" to "MX", + "nd" to "ZW", + "ndc" to "MZ", + "nds" to "DE", + "ne" to "NP", + "new" to "NP", + "ng" to "NA", + "ngl" to "MZ", + "nhe" to "MX", + "nhw" to "MX", + "nij" to "ID", + "niu" to "NU", + "njo" to "IN", + "nl" to "NL", + "nmg" to "CM", + "nn" to "NO", + "nnh" to "CM", + "nnp" to "IN", + "no" to "NO", + "nod" to "TH", + "noe" to "IN", + "non" to "SE", + "nqo" to "GN", + "nr" to "ZA", + "nsk" to "CA", + "nso" to "ZA", + "nus" to "SS", + "nv" to "US", + "nxq" to "CN", + "ny" to "MW", + "nym" to "TZ", + "nyn" to "UG", + "nzi" to "GH", + "oc" to "FR", + "om" to "ET", + "or" to "IN", + "os" to "GE", + "osa" to "US", + "otk" to "MN", + "pa" to "IN", + "pa-Arab" to "PK", + "pag" to "PH", + "pal" to "IR", + "pal-Phlp" to "CN", + "pam" to "PH", + "pap" to "AW", + "pau" to "PW", + "pcd" to "FR", + "pcm" to "NG", + "pdc" to "US", + "pdt" to "CA", + "peo" to "IR", + "pfl" to "DE", + "phn" to "LB", + "pka" to "IN", + "pko" to "KE", + "pl" to "PL", + "pms" to "IT", + "pnt" to "GR", + "pon" to "FM", + "ppa" to "IN", + "pra" to "PK", + "prd" to "IR", + "ps" to "AF", + "pt" to "PT", + "pt-br" to "BR", + "puu" to "GA", + "qu" to "PE", + "quc" to "GT", + "qug" to "EC", + "raj" to "IN", + "rcf" to "RE", + "rej" to "ID", + "rgn" to "IT", + "rhg" to "MM", + "ria" to "IN", + "rif" to "MA", + "rjs" to "NP", + "rkt" to "BD", + "rm" to "CH", + "rmf" to "FI", + "rmo" to "CH", + "rmt" to "IR", + "rmu" to "SE", + "rn" to "BI", + "rng" to "MZ", + "ro" to "RO", + "rob" to "ID", + "rof" to "TZ", + "rtm" to "FJ", + "ru" to "RU", + "rue" to "UA", + "rug" to "SB", + "rw" to "RW", + "rwk" to "TZ", + "ryu" to "JP", + "sa" to "IN", + "saf" to "GH", + "sah" to "RU", + "saq" to "KE", + "sas" to "ID", + "sat" to "IN", + "sav" to "SN", + "saz" to "IN", + "sbp" to "TZ", + "sc" to "IT", + "sck" to "IN", + "scn" to "IT", + "sco" to "GB", + "scs" to "CA", + "sd" to "PK", + "sd-Deva" to "IN", + "sd-Khoj" to "IN", + "sd-Sind" to "IN", + "sdc" to "IT", + "sdh" to "IR", + "se" to "NO", + "sef" to "CI", + "seh" to "MZ", + "sei" to "MX", + "ses" to "ML", + "sg" to "CF", + "sga" to "IE", + "sgs" to "LT", + "shi" to "MA", + "shn" to "MM", + "si" to "LK", + "sid" to "ET", + "sk" to "SK", + "skr" to "PK", + "sl" to "SI", + "sli" to "PL", + "sly" to "ID", + "sm" to "WS", + "sma" to "SE", + "smj" to "SE", + "smn" to "FI", + "smp" to "IL", + "sms" to "FI", + "sn" to "ZW", + "snk" to "ML", + "so" to "SO", + "sog" to "UZ", + "sou" to "TH", + "sq" to "AL", + "sr" to "RS", + "srb" to "IN", + "srn" to "SR", + "srr" to "SN", + "srx" to "IN", + "ss" to "ZA", + "ssy" to "ER", + "st" to "ZA", + "stq" to "DE", + "su" to "ID", + "suk" to "TZ", + "sus" to "GN", + "sv" to "SE", + "sw" to "TZ", + "swb" to "YT", + "swc" to "CD", + "swg" to "DE", + "swv" to "IN", + "sxn" to "ID", + "syl" to "BD", + "syr" to "IQ", + "szl" to "PL", + "ta" to "IN", + "taj" to "NP", + "tbw" to "PH", + "tcy" to "IN", + "tdd" to "CN", + "tdg" to "NP", + "tdh" to "NP", + "tdu" to "MY", + "te" to "IN", + "tem" to "SL", + "teo" to "UG", + "tet" to "TL", + "tg" to "TJ", + "tg-Arab" to "PK", + "th" to "TH", + "thl" to "NP", + "thq" to "NP", + "thr" to "NP", + "ti" to "ET", + "tig" to "ER", + "tiv" to "NG", + "tk" to "TM", + "tkl" to "TK", + "tkr" to "AZ", + "tkt" to "NP", + "tl" to "PH", + "tly" to "AZ", + "tmh" to "NE", + "tn" to "ZA", + "to" to "TO", + "tog" to "MW", + "tpi" to "PG", + "tr" to "TR", + "tru" to "TR", + "trv" to "TW", + "ts" to "ZA", + "tsd" to "GR", + "tsf" to "NP", + "tsg" to "PH", + "tsj" to "BT", + "tt" to "RU", + "ttj" to "UG", + "tts" to "TH", + "ttt" to "AZ", + "tum" to "MW", + "tvl" to "TV", + "twq" to "NE", + "txg" to "CN", + "ty" to "PF", + "tyv" to "RU", + "tzm" to "MA", + "udm" to "RU", + "ug" to "CN", + "ug-Cyrl" to "KZ", + "uga" to "SY", + "uk" to "UA", + "uli" to "FM", + "umb" to "AO", + "und" to "US", + "unr" to "IN", + "unr-Deva" to "NP", + "unx" to "IN", + "ur" to "PK", + "uz" to "UZ", + "uz-Arab" to "AF", + "vai" to "LR", + "ve" to "ZA", + "vec" to "IT", + "vep" to "RU", + "vi" to "VN", + "vic" to "SX", + "vls" to "BE", + "vmf" to "DE", + "vmw" to "MZ", + "vot" to "RU", + "vro" to "EE", + "vun" to "TZ", + "wa" to "BE", + "wae" to "CH", + "wal" to "ET", + "war" to "PH", + "wbp" to "AU", + "wbq" to "IN", + "wbr" to "IN", + "wls" to "WF", + "wni" to "KM", + "wo" to "SN", + "wsg" to "IN", + "wtm" to "IN", + "wuu" to "CN", + "xav" to "BR", + "xco" to "UZ", + "xcr" to "TR", + "xh" to "ZA", + "xlc" to "TR", + "xld" to "TR", + "xmf" to "GE", + "xmn" to "CN", + "xmr" to "SD", + "xna" to "SA", + "xnr" to "IN", + "xog" to "UG", + "xpr" to "IR", + "xsa" to "YE", + "xsr" to "NP", + "yao" to "MZ", + "yap" to "FM", + "yav" to "CM", + "ybb" to "CM", + "yo" to "NG", + "yrl" to "BR", + "yua" to "MX", + "yue" to "HK", + "yue-Hans" to "CN", + "za" to "CN", + "zag" to "SD", + "zdj" to "KM", + "zea" to "NL", + "zgh" to "MA", + "zh" to "CN", + "zh-cn" to "CN", + "zh-hk" to "HK", + "zh-mo" to "MO", + "zh-tw" to "TW", + "zh-Bopo" to "TW", + "zh-Hanb" to "TW", + "zh-Hant" to "TW", + "zhx" to "CN", + "zkt" to "CN", + "zlm" to "TG", + "zmi" to "MY", + "zu" to "ZA", + "zza" to "TR", +) \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/settings/language/SettingsLanguageScreen.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/settings/language/SettingsLanguageScreen.kt index 0dd913d..1447184 100644 --- a/app/src/main/java/com/kaajjo/libresudoku/ui/settings/language/SettingsLanguageScreen.kt +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/settings/language/SettingsLanguageScreen.kt @@ -4,6 +4,8 @@ import android.os.Build import androidx.appcompat.app.AppCompatDelegate import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -17,6 +19,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.Text +import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -25,19 +28,23 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.os.LocaleListCompat import com.kaajjo.libresudoku.R import com.kaajjo.libresudoku.core.WEBLATE_ENGAGE import com.kaajjo.libresudoku.ui.components.AnimatedNavigation -import com.kaajjo.libresudoku.ui.components.PreferenceRow import com.kaajjo.libresudoku.ui.components.ScrollbarLazyColumn +import com.kaajjo.libresudoku.ui.components.locale_emoji.LocaleEmoji import com.kaajjo.libresudoku.ui.settings.SettingsScaffoldLazyColumn +import com.kaajjo.libresudoku.ui.theme.ColorUtils.harmonizeWithPrimary import com.kaajjo.libresudoku.ui.util.findActivity import com.kaajjo.libresudoku.ui.util.getCurrentLocaleTag import com.kaajjo.libresudoku.ui.util.getLangs @@ -58,11 +65,12 @@ fun SettingsLanguageScreen( SettingsScaffoldLazyColumn( titleText = stringResource(R.string.pref_app_language), navigator = navigator - ) { paddingValues -> + ) { paddingValues -> ScrollbarLazyColumn( modifier = Modifier .padding(paddingValues) - .fillMaxWidth() + .fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(12.dp) ) { item { HelpTranslateCard( @@ -74,15 +82,16 @@ fun SettingsLanguageScreen( item { Spacer(modifier = Modifier.height(12.dp)) } - items(appLanguages.toList()) { language -> + items(appLanguages.toList()) { (langCode, langName) -> LanguageItem( - languageName = language.second, - selected = currentLanguage == language.first, + languageName = langName, + languageEmoji = LocaleEmoji.getFlagEmoji(langCode), + selected = currentLanguage == langCode, onClick = { - val locale = if (language.first == "") { + val locale = if (langCode == "") { LocaleListCompat.getEmptyLocaleList() } else { - LocaleListCompat.forLanguageTags(language.first) + LocaleListCompat.forLanguageTags(langCode) } AppCompatDelegate.setApplicationLocales(locale) currentLanguage = getCurrentLocaleTag() @@ -128,7 +137,7 @@ private fun HelpTranslateCard( ) { Text( text = stringResource(R.string.help_translate), - style = MaterialTheme.typography.titleLarge.copy(fontSize = 24.sp ) + style = MaterialTheme.typography.titleLarge.copy(fontSize = 24.sp) ) Text( text = stringResource(R.string.hosted_weblate) @@ -145,25 +154,63 @@ private fun HelpTranslateCard( @Composable private fun LanguageItem( languageName: String, + languageEmoji: String?, selected: Boolean, onClick: () -> Unit, modifier: Modifier = Modifier ) { - PreferenceRow( - modifier = modifier.background( - if (selected) { - MaterialTheme.colorScheme.surfaceVariant - } else { - MaterialTheme.colorScheme.surface + val titleStyle = MaterialTheme.typography.titleLarge.copy( + color = MaterialTheme.colorScheme.onSurface, + fontSize = 20.sp + ) + + Row( + modifier = modifier + .fillMaxWidth() + .padding(horizontal = 12.dp) + .clip(MaterialTheme.shapes.large) + .background( + color = with(MaterialTheme.colorScheme) { + if (selected) surfaceContainerLowest.harmonizeWithPrimary() + else Color.Transparent + } + ) + .clickable(onClick = onClick) + .padding(vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + if (languageEmoji != null) { + Box( + modifier = Modifier + .padding(horizontal = 6.dp) + .clip(MaterialTheme.shapes.medium) + .background(MaterialTheme.colorScheme.surfaceColorAtElevation(12.dp)), + contentAlignment = Alignment.Center + ) { + val localDensity = LocalDensity.current + with(localDensity) { + Text( + text = languageEmoji, + fontSize = 24.dp.toSp(), + textAlign = TextAlign.Center, + modifier = Modifier.padding(8.dp) + ) + } } - ), - title = languageName, - onClick = onClick, - action = { - RadioButton( - selected = selected, - onClick = onClick + } + Column( + Modifier + .padding(start = if (languageEmoji != null) 6.dp else 12.dp) + .weight(1f), + ) { + Text( + text = languageName, + style = titleStyle ) } - ) + RadioButton( + selected = selected, + onClick = onClick + ) + } } \ No newline at end of file