| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607 |
- /*
- * Copyright (c) 2019 gomgom. https://www.gomgom.net
- *
- * Source code has been modified by FlutterFlow, Inc. and the below license
- * applies only to this file. Adapted from "language_picker" pub.dev package.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
- import 'package:emoji_flag_converter/emoji_flag_converter.dart';
- import 'package:flutter/material.dart';
- class FlutterFlowLanguageSelector extends StatelessWidget {
- const FlutterFlowLanguageSelector({
- Key? key,
- required this.currentLanguage,
- required this.languages,
- required this.onChanged,
- this.width,
- this.height,
- this.backgroundColor,
- this.borderColor = const Color(0xFF262D34),
- this.borderRadius = 8.0,
- this.textStyle,
- this.hideFlags = false,
- this.flagSize = 24.0,
- this.flagTextGap = 8.0,
- this.dropdownColor,
- this.dropdownIconColor = const Color(0xFF14181B),
- this.dropdownIcon,
- }) : super(key: key);
- final double? width;
- final double? height;
- final String currentLanguage;
- final List<String> languages;
- final Function(String) onChanged;
- final Color? backgroundColor;
- final Color? borderColor;
- final double borderRadius;
- final TextStyle? textStyle;
- final bool hideFlags;
- final double flagSize;
- final double? flagTextGap;
- final Color? dropdownColor;
- final Color? dropdownIconColor;
- final IconData? dropdownIcon;
- @override
- Widget build(BuildContext context) => Container(
- width: width,
- height: height,
- child: _LanguagePickerDropdown(
- currentLanguage: currentLanguage,
- languages: _languageMap(languages.toSet()),
- onChanged: onChanged,
- backgroundColor: backgroundColor,
- borderColor: borderColor,
- borderRadius: borderRadius,
- dropdownColor: dropdownColor,
- dropdownIconColor: dropdownIconColor,
- dropdownIcon: dropdownIcon,
- itemBuilder: (language) => _LanguagePickerItem(
- language: language.isoCode,
- languages: languages,
- textStyle: textStyle,
- hideFlags: hideFlags,
- flagSize: flagSize,
- flagTextGap: flagTextGap,
- ),
- ),
- );
- }
- class _LanguagePickerItem extends StatelessWidget {
- const _LanguagePickerItem({
- Key? key,
- required this.language,
- required this.languages,
- this.textStyle,
- this.hideFlags = false,
- this.flagSize = 24.0,
- this.flagTextGap = 8.0,
- }) : super(key: key);
- final String language;
- final List<String> languages;
- final TextStyle? textStyle;
- final bool hideFlags;
- final double flagSize;
- final double? flagTextGap;
- @override
- Widget build(BuildContext context) {
- final flagInfo = languageToCountryInfo[language];
- Widget flagWidget = Container();
- if (flagInfo is String) {
- final flagEmoji = EmojiConverter.fromAlpha2CountryCode(flagInfo);
- flagWidget = Padding(
- padding: const EdgeInsets.only(bottom: 2.0),
- child: Text(
- flagEmoji,
- style: const TextStyle(fontSize: 20.0),
- ),
- );
- } else if (flagInfo is Map) {
- final flagUrl = flagInfo['flag'] as String;
- flagWidget = Image.network(
- flagUrl,
- width: 24,
- height: 20,
- );
- }
- flagWidget = Transform.scale(
- scale: flagSize / 24.0,
- child: Container(
- width: 24,
- child: flagWidget,
- ),
- );
- return Row(
- children: [
- if (!hideFlags) ...[
- flagWidget,
- SizedBox(width: flagTextGap),
- ],
- Text(
- _languageMap(languages.toSet())[language]?.name ?? '',
- style: textStyle ??
- const TextStyle(
- color: Colors.white,
- fontSize: 13,
- fontWeight: FontWeight.normal,
- ),
- ),
- ],
- );
- }
- }
- /// Provides a customizable [DropdownButton] for all languages
- class _LanguagePickerDropdown extends StatelessWidget {
- const _LanguagePickerDropdown({
- required this.itemBuilder,
- required this.currentLanguage,
- required this.onChanged,
- required this.languages,
- this.backgroundColor,
- this.borderColor = const Color(0xFF262D34),
- this.borderRadius = 8.0,
- this.dropdownColor,
- this.dropdownIconColor = const Color(0xFF14181B),
- this.dropdownIcon,
- });
- /// This function will be called to build the child of DropdownMenuItem.
- final Widget Function(Language) itemBuilder;
- /// The current ISO ALPHA-2 code.
- final String currentLanguage;
- /// This function will be called whenever a Language item is selected.
- final ValueChanged<String> onChanged;
- /// List of languages available in this picker.
- final Map<String, Language> languages;
- final Color? backgroundColor;
- final Color? borderColor;
- final double borderRadius;
- final Color? dropdownColor;
- final Color? dropdownIconColor;
- final IconData? dropdownIcon;
- @override
- Widget build(BuildContext context) {
- List<DropdownMenuItem<String>> items = languages.values
- .map(
- (language) => DropdownMenuItem<String>(
- value: language.isoCode,
- child: itemBuilder(language),
- ),
- )
- .toList();
- return Container(
- height: 44.0,
- decoration: BoxDecoration(
- color: backgroundColor,
- border: Border.all(color: borderColor ?? Colors.transparent),
- borderRadius: BorderRadius.circular(borderRadius),
- ),
- child: Padding(
- padding: const EdgeInsets.symmetric(horizontal: 15.0),
- child: Center(
- child: DropdownButton<String>(
- isExpanded: true,
- underline: Container(),
- dropdownColor: dropdownColor ?? backgroundColor,
- focusColor: Colors.transparent,
- iconEnabledColor: dropdownIconColor,
- iconDisabledColor: dropdownIconColor,
- icon: dropdownIcon != null
- ? Icon(
- dropdownIcon,
- size: 18.0,
- color: dropdownIconColor,
- )
- : null,
- hint: const Text(
- 'Unset',
- style: TextStyle(
- color: Colors.red,
- fontFamily: 'Product Sans',
- fontStyle: FontStyle.italic,
- fontSize: 15,
- ),
- ),
- onChanged: (val) {
- if (val != null) {
- onChanged(val);
- }
- },
- items: items,
- value: currentLanguage.isNotEmpty ? currentLanguage : null,
- ),
- ),
- ),
- );
- }
- }
- class Language {
- Language(this.isoCode, this.name);
- Language.fromMap(Map<String, String> map)
- : name = map['name']!,
- isoCode = map['isoCode']!;
- final String name;
- final String isoCode;
- }
- Map<String, Language> _languageMap(Set<String> languages) => Map.fromEntries(
- _defaultLanguagesList
- .where((element) => languages.contains(element['isoCode']))
- .map((e) => MapEntry(e['isoCode']!, Language.fromMap(e))),
- );
- final List<Map<String, String>> _defaultLanguagesList = [
- {"isoCode": "aa", "name": "Afaraf"},
- {"isoCode": "af", "name": "Afrikaans"},
- {"isoCode": "ak", "name": "Akan"},
- {"isoCode": "sq", "name": "Shqip"},
- {"isoCode": "am", "name": "አማርኛ"},
- {"isoCode": "ar", "name": "العربية"},
- {"isoCode": "hy", "name": "Հայերեն"},
- {"isoCode": "as", "name": "অসমীয়া"},
- {"isoCode": "ay", "name": "Aymar"},
- {"isoCode": "az", "name": "Azərbaycan"},
- {"isoCode": "bm", "name": "Bamanankan"},
- {"isoCode": "ba", "name": "Башҡорт теле"},
- {"isoCode": "eu", "name": "Euskara, Euskera"},
- {"isoCode": "be", "name": "Беларуская мова"},
- {"isoCode": "bn", "name": "বাংলা"},
- {"isoCode": "bh", "name": "भोजपुरी"},
- {"isoCode": "bi", "name": "Bislama"},
- {"isoCode": "nb", "name": "Norsk bokmål"},
- {"isoCode": "bs", "name": "Bosanski jezik"},
- {"isoCode": "br", "name": "Brezhoneg"},
- {"isoCode": "bg", "name": "Български език"},
- {"isoCode": "my", "name": "ဗမာစာ"},
- {"isoCode": "ca", "name": "Català"},
- {"isoCode": "km", "name": "ភាសាខ្មែរ"},
- {"isoCode": "ch", "name": "Chamoru"},
- {"isoCode": "ce", "name": "Нохчийн мотт"},
- {"isoCode": "ny", "name": "chiCheŵa"},
- {"isoCode": "zh_Hans", "name": "中文 (简体)"},
- {"isoCode": "zh_Hant", "name": "中文 (繁體)"},
- {"isoCode": "cv", "name": "чӑваш чӗлхи"},
- {"isoCode": "cr", "name": "ᓀᐦᐃᔭᐍᐏᐣ"},
- {"isoCode": "hr", "name": "Hrvatski jezik"},
- {"isoCode": "cs", "name": "Čeština"},
- {"isoCode": "da", "name": "Dansk"},
- {"isoCode": "dv", "name": "ދިވެހި"},
- {"isoCode": "nl", "name": "Nederlands"},
- {"isoCode": "dz", "name": "རྫོང་ཁ"},
- {"isoCode": "en", "name": "English"},
- {"isoCode": "eo", "name": "Esperanto"},
- {"isoCode": "et", "name": "Eesti"},
- {"isoCode": "ee", "name": "Eʋegbe"},
- {"isoCode": "fo", "name": "Føroyskt"},
- {"isoCode": "fj", "name": "vosa Vakaviti"},
- {"isoCode": "fi", "name": "Suomi"},
- {"isoCode": "fr", "name": "Français"},
- {"isoCode": "ff", "name": "Fulfulde"},
- {"isoCode": "gd", "name": "Gàidhlig"},
- {"isoCode": "gl", "name": "Galego"},
- {"isoCode": "lg", "name": "Luganda"},
- {"isoCode": "ka", "name": "ქართული"},
- {"isoCode": "de", "name": "Deutsch"},
- {"isoCode": "el", "name": "ελληνικά"},
- {"isoCode": "gn", "name": "Avañe'ẽ"},
- {"isoCode": "gu", "name": "ગુજરાતી"},
- {"isoCode": "ht", "name": "Kreyòl ayisyen"},
- {"isoCode": "ha", "name": "هَوُسَ"},
- {"isoCode": "he", "name": "עברית"},
- {"isoCode": "hz", "name": "Otjiherero"},
- {"isoCode": "hi", "name": "हिन्दी"},
- {"isoCode": "ho", "name": "Hiri Motu"},
- {"isoCode": "hu", "name": "Magyar"},
- {"isoCode": "is", "name": "Íslenska"},
- {"isoCode": "io", "name": "Ido"},
- {"isoCode": "ig", "name": "Asụsụ Igbo"},
- {"isoCode": "id", "name": "Bahasa Indonesia"},
- {"isoCode": "ia", "name": "Interlingua"},
- {"isoCode": "ie", "name": "Interlingue"},
- {"isoCode": "iu", "name": "ᐃᓄᒃᑎᑐᑦ"},
- {"isoCode": "ik", "name": "Iñupiaq"},
- {"isoCode": "ga", "name": "Gaeilge"},
- {"isoCode": "it", "name": "Italiano"},
- {"isoCode": "ja", "name": "日本語 (にほんご)"},
- {"isoCode": "jv", "name": "ꦧꦱꦗꦮ"},
- {"isoCode": "kl", "name": "Kalaallisut"},
- {"isoCode": "kn", "name": "ಕನ್ನಡ"},
- {"isoCode": "kr", "name": "Kanuri"},
- {"isoCode": "ks", "name": "कश्मीरी"},
- {"isoCode": "kk", "name": "қазақ тілі"},
- {"isoCode": "ki", "name": "Gĩkũyũ"},
- {"isoCode": "rw", "name": "Ikinyarwanda"},
- {"isoCode": "ky", "name": "Кыргызча"},
- {"isoCode": "kv", "name": "коми кыв"},
- {"isoCode": "kg", "name": "Kikongo"},
- {"isoCode": "ko", "name": "한국어"},
- {"isoCode": "kj", "name": "Kuanyama"},
- {"isoCode": "ku", "name": "Kurdî"},
- {"isoCode": "lo", "name": "ພາສາລາວ"},
- {"isoCode": "la", "name": "Latine"},
- {"isoCode": "lv", "name": "Latviešu valoda"},
- {"isoCode": "li", "name": "Limburgs"},
- {"isoCode": "ln", "name": "Lingála"},
- {"isoCode": "lt", "name": "Lietuvių kalba"},
- {"isoCode": "lu", "name": "Tshiluba"},
- {"isoCode": "lb", "name": "Lëtzebuergesch"},
- {"isoCode": "mk", "name": "Македонски јазик"},
- {"isoCode": "mg", "name": "Fiteny Malagasy"},
- {"isoCode": "ms", "name": "Bahasa Melayu"},
- {"isoCode": "ml", "name": "മലയാളം"},
- {"isoCode": "mt", "name": "Malti"},
- {"isoCode": "gv", "name": "Gaelg, Gailck"},
- {"isoCode": "mi", "name": "te reo Māori"},
- {"isoCode": "mr", "name": "मराठी"},
- {"isoCode": "mh", "name": "Kajin M̧ajeļ"},
- {"isoCode": "mn", "name": "Монгол хэл"},
- {"isoCode": "na", "name": "Dorerin Naoero"},
- {"isoCode": "nv", "name": "Diné bizaad"},
- {"isoCode": "nd", "name": "Ndebele (Southern)"},
- {"isoCode": "nr", "name": "Ndebele (Northern)"},
- {"isoCode": "ng", "name": "Owambo"},
- {"isoCode": "ne", "name": "नेपाली"},
- {"isoCode": "se", "name": "Davvisámegiella"},
- {"isoCode": "no", "name": "Norsk"},
- {"isoCode": "nn", "name": "Norsk nynorsk"},
- {"isoCode": "oc", "name": "Occitan"},
- {"isoCode": "oj", "name": "ᐊᓂᔑᓈᐯᒧᐎᓐ"},
- {"isoCode": "or", "name": "ଓଡ଼ିଆ"},
- {"isoCode": "om", "name": "Afaan Oromoo"},
- {"isoCode": "os", "name": "ирон æвзаг"},
- {"isoCode": "pi", "name": "पाऴि"},
- {"isoCode": "pa", "name": "ਪੰਜਾਬੀ"},
- {"isoCode": "fa", "name": "فارسی"},
- {"isoCode": "pl", "name": "Polski"},
- {"isoCode": "pt", "name": "Português"},
- {"isoCode": "ps", "name": "پښتو"},
- {"isoCode": "qu", "name": "Runa Simi, Kichwa"},
- {"isoCode": "ro", "name": "Română"},
- {"isoCode": "rm", "name": "rumantsch grischun"},
- {"isoCode": "rn", "name": "Ikirundi"},
- {"isoCode": "ru", "name": "Русский"},
- {"isoCode": "sm", "name": "gagana fa'a Samoa"},
- {"isoCode": "sg", "name": "yângâ tî sängö"},
- {"isoCode": "sa", "name": "संस्कृतम्"},
- {"isoCode": "sc", "name": "Sardu"},
- {"isoCode": "sr", "name": "српски језик"},
- {"isoCode": "sn", "name": "chiShona"},
- {"isoCode": "ii", "name": "ꆈꌠ꒿ Nuosuhxop"},
- {"isoCode": "sd", "name": "सिन्धी"},
- {"isoCode": "si", "name": "සිංහල"},
- {"isoCode": "sk", "name": "Slovenský jazyk"},
- {"isoCode": "sl", "name": "Slovenščina"},
- {"isoCode": "so", "name": "Soomaaliga"},
- {"isoCode": "st", "name": "Sesotho"},
- {"isoCode": "es", "name": "Español"},
- {"isoCode": "su", "name": "Basa Sunda"},
- {"isoCode": "sw", "name": "Kiswahili"},
- {"isoCode": "ss", "name": "SiSwati"},
- {"isoCode": "sv", "name": "Svenska"},
- {"isoCode": "tl", "name": "Tagalog"},
- {"isoCode": "ty", "name": "Reo Tahiti"},
- {"isoCode": "tg", "name": "тоҷикӣ"},
- {"isoCode": "ta", "name": "தமிழ்"},
- {"isoCode": "tt", "name": "татар теле"},
- {"isoCode": "te", "name": "తెలుగు"},
- {"isoCode": "th", "name": "ไทย"},
- {"isoCode": "bo", "name": "བོད་ཡིག"},
- {"isoCode": "ti", "name": "ትግርኛ"},
- {"isoCode": "to", "name": "faka Tonga"},
- {"isoCode": "ts", "name": "Xitsonga"},
- {"isoCode": "tn", "name": "Setswana"},
- {"isoCode": "tr", "name": "Türkçe"},
- {"isoCode": "tk", "name": "Түркмен"},
- {"isoCode": "tw", "name": "Twi"},
- {"isoCode": "ug", "name": "ئۇيغۇرچە"},
- {"isoCode": "uk", "name": "Українська"},
- {"isoCode": "ur", "name": "اردو"},
- {"isoCode": "uz", "name": "Oʻzbek"},
- {"isoCode": "ve", "name": "Tshivenḓa"},
- {"isoCode": "vi", "name": "Tiếng Việt"},
- {"isoCode": "vo", "name": "Volapük"},
- {"isoCode": "wa", "name": "Walon"},
- {"isoCode": "cy", "name": "Cymraeg"},
- {"isoCode": "fy", "name": "Frysk"},
- {"isoCode": "wo", "name": "Wollof"},
- {"isoCode": "xh", "name": "Xhosa"},
- {"isoCode": "yi", "name": "ייִדיש"},
- {"isoCode": "yo", "name": "Yorùbá"},
- {"isoCode": "za", "name": "Saɯ cueŋƅ"},
- {"isoCode": "zu", "name": "Zulu"},
- ];
- final Map<String, dynamic> languageToCountryInfo = {
- "aa": "dj",
- "af": "za",
- "ak": "gh",
- "sq": "al",
- "am": "et",
- "ar": {
- "proposed_iso_3166": "aa",
- "flag":
- "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2b/Flag_of_the_Arab_League.svg/400px-Flag_of_the_Arab_League.svg.png",
- "name": "Arab League"
- },
- "hy": "am",
- "ay": {
- "proposed_iso_3166": "wh",
- "flag":
- "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Banner_of_the_Qulla_Suyu.svg/1920px-Banner_of_the_Qulla_Suyu.svg.png",
- "name": "Wiphala"
- },
- "az": "az",
- "bm": "ml",
- "be": "by",
- "bn": "bd",
- "bi": "vu",
- "bs": "ba",
- "bg": "bg",
- "my": "mm",
- "ca": "ad",
- "zh": "cn",
- "hr": "hr",
- "cs": "cz",
- "da": "dk",
- "dv": "mv",
- "nl": "nl",
- "dz": "bt",
- "en": "gb",
- "et": "ee",
- "ee": {
- "proposed_iso_3166": "ew",
- "flag":
- "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Flag_of_the_Ewe_people.svg/2880px-Flag_of_the_Ewe_people.svg.png",
- "name": "Ewe"
- },
- "fj": "fj",
- "fil": "ph",
- "fi": "fi",
- "fr": "fr",
- "gaa": "gh",
- "ka": "ge",
- "kl": "gl",
- "de": "de",
- "el": "gr",
- "gu": "in",
- "ht": "ht",
- "he": "il",
- "hi": "in",
- "ho": "pg",
- "hu": "hu",
- "is": "is",
- "ig": "ng",
- "id": "id",
- "ga": "ie",
- "it": "it",
- "ja": "jp",
- "kr": "ne",
- "kk": "kz",
- "km": "kh",
- "kmb": "ao",
- "rw": "rw",
- "kg": "cg",
- "ko": "kr",
- "kj": "ao",
- "ku": "iq",
- "ky": "kg",
- "lo": "la",
- "la": "va",
- "lv": "lv",
- "ln": "cg",
- "lt": "lt",
- "lu": "cd",
- "lb": "lu",
- "mk": "mk",
- "mg": "mg",
- "ms": "my",
- "mt": "mt",
- "mi": "nz",
- "mh": "mh",
- "mn": "mn",
- "mos": "bf",
- "ne": "np",
- "nd": "zw",
- "nso": "za",
- "no": "no",
- "nb": "no",
- "nn": "no",
- "ny": "mw",
- "pap": "aw",
- "ps": "af",
- "fa": "ir",
- "pl": "pl",
- "pt": "pt",
- "pa": "in",
- "qu": "wh",
- "ro": "ro",
- "rm": "ch",
- "rn": "bi",
- "ru": "ru",
- "sg": "cf",
- "sr": "rs",
- "srr": "sn",
- "sn": "zw",
- "si": "lk",
- "sk": "sk",
- "sl": "si",
- "so": "so",
- "snk": "sn",
- "nr": "za",
- "st": "ls",
- "es": "es",
- "sw": {
- "proposed_iso_3166": "sw",
- "flag":
- "https://upload.wikimedia.org/wikipedia/commons/d/de/Flag_of_Swahili.gif",
- "name": "Swahili"
- },
- "ss": "sz",
- "sv": "se",
- "tl": "ph",
- "tg": "tj",
- "ta": "lk",
- "te": "in",
- "tet": "tl",
- "th": "th",
- "ti": "er",
- "tpi": "pg",
- "ts": "za",
- "tn": "bw",
- "tr": "tr",
- "tk": "tm",
- "uk": "ua",
- "umb": "ao",
- "ur": "pk",
- "uz": "uz",
- "ve": "za",
- "vi": "vn",
- "cy": "gb",
- "wo": "sn",
- "xh": "za",
- "yo": {
- "proposed_iso_3166": "yo",
- "flag":
- "https://upload.wikimedia.org/wikipedia/commons/0/04/Flag_of_the_Yoruba_people.svg",
- "name": "Yoruba"
- },
- "zu": "za",
- // Custom
- "zh_Hans": "cn",
- "zh_Hant": "cn",
- "fo": "fo",
- "bo": "bo",
- "to": "to",
- };
|