├── fastlane └── metadata │ └── android │ ├── ru │ ├── changelogs │ │ ├── 4.txt │ │ ├── 7.txt │ │ ├── 6.txt │ │ ├── 10.txt │ │ ├── 9.txt │ │ ├── 5.txt │ │ ├── 8.txt │ │ └── 12.txt │ ├── title.txt │ ├── short_description.txt │ ├── images │ │ ├── icon.png │ │ └── phoneScreenshots │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ └── 5.png │ └── full_description.txt │ ├── uk │ ├── changelogs │ │ ├── 4.txt │ │ ├── 7.txt │ │ ├── 6.txt │ │ ├── 10.txt │ │ ├── 9.txt │ │ ├── 5.txt │ │ ├── 12.txt │ │ └── 8.txt │ ├── title.txt │ ├── short_description.txt │ ├── images │ │ ├── icon.png │ │ └── phoneScreenshots │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ └── 5.png │ └── full_description.txt │ ├── de │ ├── title.txt │ ├── changelogs │ │ ├── 4.txt │ │ ├── 13.txt │ │ ├── 7.txt │ │ ├── 6.txt │ │ ├── 10.txt │ │ ├── 8.txt │ │ ├── 9.txt │ │ ├── 5.txt │ │ └── 12.txt │ ├── short_description.txt │ ├── images │ │ ├── icon.png │ │ ├── featureGraphic.png │ │ └── phoneScreenshots │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ └── 5.png │ └── full_description.txt │ ├── en-US │ ├── changelogs │ │ ├── 4.txt │ │ ├── 13.txt │ │ ├── 7.txt │ │ ├── 6.txt │ │ ├── 10.txt │ │ ├── 12.txt │ │ ├── 8.txt │ │ ├── 9.txt │ │ └── 5.txt │ ├── title.txt │ ├── short_description.txt │ ├── images │ │ ├── icon.png │ │ ├── featureGraphic.png │ │ └── phoneScreenshots │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ └── 5.png │ └── full_description.txt │ ├── es │ ├── title.txt │ ├── changelogs │ │ ├── 4.txt │ │ ├── 6.txt │ │ ├── 13.txt │ │ ├── 7.txt │ │ ├── 10.txt │ │ ├── 9.txt │ │ ├── 5.txt │ │ ├── 12.txt │ │ └── 8.txt │ ├── short_description.txt │ ├── images │ │ ├── icon.png │ │ ├── featureGraphic.png │ │ └── phoneScreenshots │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ └── 5.png │ └── full_description.txt │ ├── fr │ ├── title.txt │ ├── changelogs │ │ ├── 4.txt │ │ ├── 13.txt │ │ ├── 7.txt │ │ ├── 6.txt │ │ ├── 10.txt │ │ ├── 9.txt │ │ ├── 5.txt │ │ ├── 8.txt │ │ └── 12.txt │ ├── short_description.txt │ ├── images │ │ ├── icon.png │ │ └── phoneScreenshots │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ └── 5.png │ └── full_description.txt │ ├── be │ ├── changelogs │ │ ├── 7.txt │ │ └── 8.txt │ ├── title.txt │ ├── short_description.txt │ ├── images │ │ ├── icon.png │ │ └── phoneScreenshots │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ └── 5.png │ └── full_description.txt │ └── tr │ ├── title.txt │ ├── short_description.txt │ ├── images │ ├── icon.png │ ├── featureGraphic.png │ └── phoneScreenshots │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ └── 5.png │ └── full_description.txt ├── ios ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ ├── Generated.xcconfig │ ├── flutter_export_environment.sh │ └── AppFrameworkInfo.plist ├── Runner │ ├── AppDelegate.h │ ├── Assets.xcassets │ │ ├── LaunchImage.imageset │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ ├── README.md │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── main.m │ ├── GeneratedPluginRegistrant.h │ ├── AppDelegate.m │ ├── GeneratedPluginRegistrant.m │ ├── Info.plist │ └── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── WorkspaceSettings.xcsettings └── Runner.xcodeproj │ ├── project.xcworkspace │ └── contents.xcworkspacedata │ └── xcshareddata │ └── xcschemes │ └── Runner.xcscheme ├── doc └── logo.png ├── assets ├── MPLUS1p-Light.ttf ├── MPLUS1p-Medium.ttf ├── MPLUS1p-Regular.ttf ├── LICENSES.txt └── data │ ├── hira.json │ └── kata.json ├── android ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── app │ ├── src │ │ ├── main │ │ │ ├── ic_launcher-playstore.png │ │ │ ├── res │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── values-ja │ │ │ │ │ ├── strings.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── values-ru │ │ │ │ │ ├── strings.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── values-uk │ │ │ │ │ ├── strings.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── values │ │ │ │ │ ├── strings.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ │ ├── ic_launcher.xml │ │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── drawable │ │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-night │ │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-v21 │ │ │ │ │ └── launch_background.xml │ │ │ │ └── values-night │ │ │ │ │ └── styles.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── untitled │ │ │ │ │ └── MainActivity.kt │ │ │ ├── java │ │ │ │ └── io │ │ │ │ │ └── flutter │ │ │ │ │ └── plugins │ │ │ │ │ └── GeneratedPluginRegistrant.java │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ ├── build.gradle │ └── app.iml ├── .gitignore ├── build.gradle ├── settings.gradle ├── android.iml ├── untitled_android.iml ├── gradlew.bat └── gradlew ├── lib ├── Models │ ├── GlobalKanas.dart │ ├── Transliteration.dart │ └── KanaList.dart ├── Question.dart ├── UI.Utils │ └── IconCreator.dart ├── localizations.dart ├── preferences.dart ├── table.dart ├── quiz_engine.dart ├── party.dart └── main.dart ├── .gitignore ├── i18n ├── en.json ├── de.json ├── fr.json ├── be.json ├── es.json ├── tr.json ├── ru.json └── uk.json ├── pubspec.yaml └── README.md /fastlane/metadata/android/ru/changelogs/4.txt: -------------------------------------------------------------------------------- 1 | Fix some errors. -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/changelogs/4.txt: -------------------------------------------------------------------------------- 1 | Fix some errors. -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de/title.txt: -------------------------------------------------------------------------------- 1 | Nihonoari: Hiragana & Katakana -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/4.txt: -------------------------------------------------------------------------------- 1 | Fix some errors. -------------------------------------------------------------------------------- /fastlane/metadata/android/es/title.txt: -------------------------------------------------------------------------------- 1 | Nihonoari: Hiragana & Katakana -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/title.txt: -------------------------------------------------------------------------------- 1 | Nihonoari: Hiragana & Katakana -------------------------------------------------------------------------------- /fastlane/metadata/android/be/changelogs/7.txt: -------------------------------------------------------------------------------- 1 | * Дададзена беларуская мова -------------------------------------------------------------------------------- /fastlane/metadata/android/be/title.txt: -------------------------------------------------------------------------------- 1 | Ніхоноарі: хірагана і катакана 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de/changelogs/4.txt: -------------------------------------------------------------------------------- 1 | einige Fehler behoben 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | Nihonoari: Hiragana & Katakana -------------------------------------------------------------------------------- /fastlane/metadata/android/es/changelogs/4.txt: -------------------------------------------------------------------------------- 1 | Corregidos algunos errores. -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/changelogs/4.txt: -------------------------------------------------------------------------------- 1 | Correction des erreurs 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/title.txt: -------------------------------------------------------------------------------- 1 | Нихоноари: Хирагана и Катакана 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/title.txt: -------------------------------------------------------------------------------- 1 | Nihonoari: Hiragana & Katakana 2 | -------------------------------------------------------------------------------- /doc/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/doc/logo.png -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/title.txt: -------------------------------------------------------------------------------- 1 | Ніхоноарі: Хіраґана та Катакана 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/short_description.txt: -------------------------------------------------------------------------------- 1 | Небольшой да простой тренер японских кан 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/short_description.txt: -------------------------------------------------------------------------------- 1 | Невеличкий та простий тренер японських кан 2 | -------------------------------------------------------------------------------- /assets/MPLUS1p-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/assets/MPLUS1p-Light.ttf -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | A little and minimalist Japanese Kana training -------------------------------------------------------------------------------- /assets/MPLUS1p-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/assets/MPLUS1p-Medium.ttf -------------------------------------------------------------------------------- /assets/MPLUS1p-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/assets/MPLUS1p-Regular.ttf -------------------------------------------------------------------------------- /fastlane/metadata/android/be/short_description.txt: -------------------------------------------------------------------------------- 1 | Простая ды мінімалістычная праграма для вывучання японскай каны -------------------------------------------------------------------------------- /fastlane/metadata/android/de/short_description.txt: -------------------------------------------------------------------------------- 1 | Ein kleines und minimalistisches japanisches Kana-Training 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/es/short_description.txt: -------------------------------------------------------------------------------- 1 | Una app pequeña y minimalista para practicar los Kana japoneses -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/changelogs/7.txt: -------------------------------------------------------------------------------- 1 | * The selected Kana sets are remembered 2 | * Added UI translation -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/changelogs/7.txt: -------------------------------------------------------------------------------- 1 | * The selected Kana sets are remembered 2 | * Added UI translation -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/13.txt: -------------------------------------------------------------------------------- 1 | * Added a new light theme and dark theme optimized for OLED displays -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/7.txt: -------------------------------------------------------------------------------- 1 | * The selected Kana sets are remembered 2 | * Added UI translation -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/short_description.txt: -------------------------------------------------------------------------------- 1 | Une app petite et minimaliste pour pratiquer les Kana japonais 2 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /fastlane/metadata/android/es/changelogs/6.txt: -------------------------------------------------------------------------------- 1 | * Algorítmo de repetición espaciada 2 | * El teclado no se cierra al aceptar -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/changelogs/6.txt: -------------------------------------------------------------------------------- 1 | * Spaced repetition algorithm 2 | * The keyboard does not close after submit -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/short_description.txt: -------------------------------------------------------------------------------- 1 | Hiragana ve Katakana çalışabileceğiniz küçük ve sade bir uygulama 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/changelogs/6.txt: -------------------------------------------------------------------------------- 1 | * Spaced repetition algorithm 2 | * The keyboard does not close after submit -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/6.txt: -------------------------------------------------------------------------------- 1 | * Spaced repetition algorithm 2 | * The keyboard does not close after submit -------------------------------------------------------------------------------- /fastlane/metadata/android/es/changelogs/13.txt: -------------------------------------------------------------------------------- 1 | * Se añade un nuevo tema claro y se optimiza el tema oscuro para pantallas OLED -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/changelogs/13.txt: -------------------------------------------------------------------------------- 1 | * Ajout d'un nouveau thème clair et d'un thème foncé optimisé pour les écrans OLED -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/changelogs/7.txt: -------------------------------------------------------------------------------- 1 | * Les ensembles Kana sélectionnés sont mémorisés 2 | * Traduction de l'UI ajoutée -------------------------------------------------------------------------------- /fastlane/metadata/android/de/changelogs/13.txt: -------------------------------------------------------------------------------- 1 | * Neues helles Thema und dunkles Thema hinzugefügt, das für OLED-Displays optimiert ist -------------------------------------------------------------------------------- /fastlane/metadata/android/de/changelogs/7.txt: -------------------------------------------------------------------------------- 1 | * die ausgewählten Kana-Sets werden gespeichert 2 | * UI-Übersetzung hinzugefügt 3 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/10.txt: -------------------------------------------------------------------------------- 1 | * Cyrillic input for Russian and Ukrainian language 2 | * Fixed adaptive screen scaling -------------------------------------------------------------------------------- /fastlane/metadata/android/es/changelogs/7.txt: -------------------------------------------------------------------------------- 1 | * Se recuerda el conjunto de Kanas seleccionados 2 | * Se incorpora traducción a la interfaz -------------------------------------------------------------------------------- /fastlane/metadata/android/be/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/be/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/de/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/es/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/es/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/fr/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/ru/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/tr/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/uk/images/icon.png -------------------------------------------------------------------------------- /android/app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/12.txt: -------------------------------------------------------------------------------- 1 | * Fixed critical crash in older Android devices 2 | * Fixed critical crash using German language -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/es/changelogs/10.txt: -------------------------------------------------------------------------------- 1 | * Introducción cirílica para idioma ruso y ucraniano 2 | * Arreglada escala adaptativa de pantalla -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/changelogs/6.txt: -------------------------------------------------------------------------------- 1 | * Algorithme de répétition espacée 2 | * Le clavier ne se cache pas quand l'utilisateur accepte 3 | -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/changelogs/10.txt: -------------------------------------------------------------------------------- 1 | * Введення кирилиці для російської та української мови 2 | * Виправлено адаптивне масштабування екрана -------------------------------------------------------------------------------- /fastlane/metadata/android/de/changelogs/6.txt: -------------------------------------------------------------------------------- 1 | * Algorithmus für räumliche Wiederholungen 2 | * die Tastatur wird nach dem Absenden nicht geschlossen 3 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/8.txt: -------------------------------------------------------------------------------- 1 | * Added reverse function (Rōmaji to Kana) 2 | * Fixed quiz after back to main menu 3 | * Minor UI changes -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/9.txt: -------------------------------------------------------------------------------- 1 | * Fixed ambiguities in reverse mode 2 | * Integrated Turkish language 3 | * Updated dependencies and SDK -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/changelogs/10.txt: -------------------------------------------------------------------------------- 1 | * Entrée cyrillique pour la langue russe et ukrainienne 2 | * Mise à l'échelle adaptative de l'écran fixe -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/changelogs/10.txt: -------------------------------------------------------------------------------- 1 | * Кириллический ввод для русского и украинского языков 2 | * Исправлено адаптивное масштабирование экрана -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface AppDelegate : FlutterAppDelegate 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de/changelogs/10.txt: -------------------------------------------------------------------------------- 1 | * Kyrillische Eingabe für die russische und ukrainische Sprache 2 | * Adaptive Bildschirmskalierung korrigiert -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/changelogs/9.txt: -------------------------------------------------------------------------------- 1 | * Исправлены неоднозначности в режиме реверса 2 | * Интегрирован турецкий язык 3 | * Обновлены зависимости и SDK -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/changelogs/9.txt: -------------------------------------------------------------------------------- 1 | * Фіксовані неоднозначність у зворотному режимі 2 | * Інтегрована турецька мова 3 | * Оновлені залежності та SDK -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/de/images/featureGraphic.png -------------------------------------------------------------------------------- /fastlane/metadata/android/es/changelogs/9.txt: -------------------------------------------------------------------------------- 1 | * Ambigüedades en el modo inverso corregidas 2 | * Integrada la traducción al Turco 3 | * SDK y librerías actualizadas -------------------------------------------------------------------------------- /fastlane/metadata/android/es/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/es/images/featureGraphic.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/changelogs/5.txt: -------------------------------------------------------------------------------- 1 | * Set selection in Hiragana and Katakana 2 | * Improved quiz core 3 | * Fixed "ri" Katakana 4 | * Improved dark style -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/tr/images/featureGraphic.png -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/changelogs/5.txt: -------------------------------------------------------------------------------- 1 | * Set selection in Hiragana and Katakana 2 | * Improved quiz core 3 | * Fixed "ri" Katakana 4 | * Improved dark style -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-ja/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | にほのあり 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-ru/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Нихоноари 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-uk/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Ніхоноарі 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Nihonoari 4 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/5.txt: -------------------------------------------------------------------------------- 1 | * Set selection in Hiragana and Katakana 2 | * Improved quiz core 3 | * Fixed "ri" Katakana 4 | * Improved dark style -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/en-US/images/featureGraphic.png -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/changelogs/9.txt: -------------------------------------------------------------------------------- 1 | * Correction d'ambiguïtés en mode inversé 2 | * Intégration de la langue turque 3 | * Mise à jour des dépendances et du SDK -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /fastlane/metadata/android/be/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/be/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/be/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/be/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/be/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/be/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/be/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/be/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/be/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/be/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/de/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/de/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/de/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/de/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/de/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /fastlane/metadata/android/es/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/es/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/es/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/es/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/es/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/es/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/es/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/es/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/es/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/es/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/fr/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/fr/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/fr/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/fr/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/fr/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/ru/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/ru/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/ru/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/ru/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/ru/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/tr/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/tr/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/tr/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/tr/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/tr/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/uk/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/uk/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/uk/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/uk/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/uk/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de/changelogs/8.txt: -------------------------------------------------------------------------------- 1 | * Umkehrfunktion hinzugefügt (Rōmaji zu Kana) 2 | * Quiz nach Rückkehr zum Hauptmenü korrigiert 3 | * kleinere UI-Änderungen 4 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de/changelogs/9.txt: -------------------------------------------------------------------------------- 1 | * Behebung von Mehrdeutigkeiten im Rückwärtsmodus 2 | * Türkische Sprache integriert 3 | * Aktualisierte Abhängigkeiten und SDK 4 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de/changelogs/5.txt: -------------------------------------------------------------------------------- 1 | * Set-Auswahl für Hiragana und Katakana 2 | * verbesserte Quiz-Basis 3 | * Katakana "ri" korrigiert 4 | * verbesserter dunkler Stil 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/es/changelogs/5.txt: -------------------------------------------------------------------------------- 1 | * Agrupa por conjuntos de Hiragana y Katakana 2 | * Motor de preguntas mejorado 3 | * Arreglado Katakana "ri" 4 | * Tema oscuro mejorado -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /fastlane/metadata/android/es/changelogs/12.txt: -------------------------------------------------------------------------------- 1 | * Corregido fallo crítico al iniciar la aplicación en dispositivos Android antiguos 2 | * Corregido fallo crítico al usar Alemán como idioma -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/changelogs/5.txt: -------------------------------------------------------------------------------- 1 | * Ajouter par groupe Hiragana et Katakana 2 | * Algorithme de question amélioré 3 | * Réparé le Katakana "ri" 4 | * Thème sombre amélioré 5 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeri/Nihonoari-App/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de/changelogs/12.txt: -------------------------------------------------------------------------------- 1 | * Kritischer Absturz beim Starten der App auf alten Android-Geräten behoben 2 | * Kritischer Fehler bei Verwendung von Deutsch als Sprache behoben -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/changelogs/12.txt: -------------------------------------------------------------------------------- 1 | * Виправлено критичну помилку під час запуску програми на старих Android пристроях 2 | * Виправлено критичну помилку під час використання німецької мови -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/changelogs/8.txt: -------------------------------------------------------------------------------- 1 | * Додана функція зворотного тестування (Rōmaji -> Kana) 2 | * Виправлена ​​вікторина після повернення до меню 3 | * Незначні зміни в інтерфейсі користувача -------------------------------------------------------------------------------- /fastlane/metadata/android/be/changelogs/8.txt: -------------------------------------------------------------------------------- 1 | * Дададзена функцыя зваротнага тэставання (Rōmaji -> Kana) 2 | * Выпраўленая віктарына пасля вяртання ў меню 3 | * Нязначныя змены ў карыстальніцкім інтэрфейсе -------------------------------------------------------------------------------- /fastlane/metadata/android/es/changelogs/8.txt: -------------------------------------------------------------------------------- 1 | * Añadida la función de test inverso (Rōmaji a Kana) 2 | * Arreglado el cuestionario tras volver al menú principal 3 | * Cambios menores en la interfaz de usuario -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/changelogs/8.txt: -------------------------------------------------------------------------------- 1 | * Добавлена функция обратного теста (Rōmaji -> Kana) 2 | * Исправлена викторина после возврата в меню 3 | * Незначительные изменения пользовательского интерфейса -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/changelogs/8.txt: -------------------------------------------------------------------------------- 1 | * Ajout de la fonction de test inversé (Rōmaji -> Kana) 2 | * Amélioration du questionnaire après le passage au menu 3 | * Changements mineurs dans l'interface utilisateur -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/changelogs/12.txt: -------------------------------------------------------------------------------- 1 | * Исправлена критическая ошибка при запуске приложения на старых устройствах Android 2 | * Исправлена критическая ошибка при использовании немецкого языка в качестве языка -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/changelogs/12.txt: -------------------------------------------------------------------------------- 1 | * Correction d'un bug critique lors du lancement de l'application sur les anciens appareils Android 2 | * Correction d'un bug critique lors de l'utilisation de l'allemand comme langue -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /lib/Models/GlobalKanas.dart: -------------------------------------------------------------------------------- 1 | import 'package:nihonoari/Models/Transliteration.dart'; 2 | 3 | class GlobalKanas { 4 | static Map> hiraganaMap = {}; 5 | static Map> katakanaMap = {}; 6 | } 7 | -------------------------------------------------------------------------------- /ios/Runner/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char* argv[]) { 6 | @autoreleasepool { 7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip 7 | -------------------------------------------------------------------------------- /fastlane/metadata/android/be/full_description.txt: -------------------------------------------------------------------------------- 1 | Nihonoari - гэта праграма з адкрытым зыходным кодам для вывучання Катаканы і Хіраганы без рэкламы, ўнутраных пакупак ды бескарыснай функцыянальнасці, лепшае ў простым. 2 | 3 | Хочаце пасупрацоўнічаць або зрабіць справаздачу аб памылках? 4 | https://github.com/aeri/Nihonoari-App 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildSystemType 6 | Original 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | Nihonoari is an Open Source project to provide the community with a simple app to memorize and practice the Hiragana and Katakana alphabets without adverts, in-app purchases and useless functions, simpler is better. 2 | 3 | Want to collaborate with the project or report some bug? 4 | https://github.com/aeri/Nihonoari-App 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /fastlane/metadata/android/es/full_description.txt: -------------------------------------------------------------------------------- 1 | Nihonoari es un proyecto de código abierto para proporcionar a la comunidad una aplicación simple para memorizar y practicar los silabarios Hiragana y Katakana sin anuncios, compras ni funciones inútiles, más simple es mejor. 2 | 3 | ¿Quieres colaborar con el proyecto o informar de algún error? 4 | https://github.com/aeri/Nihonoari-App -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/full_description.txt: -------------------------------------------------------------------------------- 1 | Ніхоноарі - це проект з відкритим кодом, що надає спільноті простий застосунок для запам'ятовування та практикування абеток Хіраґани та Катакани без реклам, купівель, чи безтолкових функцій. Чим простіше - тим краще. 2 | 3 | Хочете співпрацювати з проектом, або повідомити кілька помилок? 4 | https://github.com/aeri/Nihonoari-App 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/full_description.txt: -------------------------------------------------------------------------------- 1 | Nihonoari est un projet Open Source créé pour offrir à la communauté une application simple pour mémoriser et pratiquer l'alphabet Hiragana et Katakana sans publicité, paiements et fonctions inutiles, le plus simple est le mieux. 2 | 3 | Veux tu collaborer avec le projet ou reporter un erreur? 4 | https://github.com/aeri/Nihonoari-App 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de/full_description.txt: -------------------------------------------------------------------------------- 1 | Nihonoari ist ein Open-Source-Projekt um der Gemeinschaft eine einfache Applikation zum Einprägen und Üben der Hiragana- und Katakana-Alphabete bereitzustellen, ohne Werbung, In-App-Käufen und nutzlosen Funktionen. Einfacher ist besser. 2 | 3 | Möchtest du am Projekt mitarbeiten oder Fehler melden? 4 | https://github.com/aeri/Nihonoari-App 5 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | allprojects { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | } 6 | } 7 | 8 | rootProject.buildDir = '../build' 9 | subprojects { 10 | project.buildDir = "${rootProject.buildDir}/${project.name}" 11 | project.evaluationDependsOn(':app') 12 | } 13 | 14 | tasks.register("clean", Delete) { 15 | delete rootProject.buildDir 16 | } 17 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/full_description.txt: -------------------------------------------------------------------------------- 1 | Нихоноари - это проект с открытым исходным кодом, что предоставляет обществу простое приложение для запоминания и практикования алфавитов Хираганы и Катаканы без реклам, внутренних покупок и бесполезных функцый. Чем проще - тем лучше. 2 | 3 | Хотите сотрудничать с проектом или известить о некоторых ошибках? 4 | https://github.com/aeri/Nihonoari-App 5 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/full_description.txt: -------------------------------------------------------------------------------- 1 | Nihonoari, Hiragana ve Katakana alfabelerini öğrenmenizi sağlayan, reklam ve uygulama içi satın alımlar içermeyen, gereksiz şeylerden arındırılmış, sade tasarıma sahip, açık kaynak kodlu bir uygulamadır. 2 | 3 | Uygulamaya katkıda bulunmak veya sorun bildirmek isterseniz lütfen uygulamanın Github sayfasını ziyaret edin: 4 | https://github.com/aeri/Nihonoari-App 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-ja/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-ru/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-uk/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/GeneratedPluginRegistrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GeneratedPluginRegistrant_h 8 | #define GeneratedPluginRegistrant_h 9 | 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface GeneratedPluginRegistrant : NSObject 15 | + (void)registerWithRegistry:(NSObject*)registry; 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | #endif /* GeneratedPluginRegistrant_h */ 20 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #include "AppDelegate.h" 2 | #include "GeneratedPluginRegistrant.h" 3 | 4 | @implementation AppDelegate 5 | 6 | - (BOOL)application:(UIApplication *)application 7 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 8 | [GeneratedPluginRegistrant registerWithRegistry:self]; 9 | // Override point for customization after application launch. 10 | return [super application:application didFinishLaunchingWithOptions:launchOptions]; 11 | } 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://www.dartlang.org/guides/libraries/private-files 2 | 3 | # Files and directories created by pub 4 | .dart_tool/ 5 | .packages 6 | .pub/ 7 | .idea/ 8 | build/ 9 | android/.gradle/ 10 | # If you're building an application, you may want to check-in your pubspec.lock 11 | pubspec.lock 12 | 13 | # Directory created by dartdoc 14 | # If you don't generate documentation locally you can remove this line. 15 | doc/api/ 16 | .metadata 17 | android/key.properties 18 | android/local.properties 19 | *.log 20 | .flutter-plugins 21 | .flutter-plugins-dependencies 22 | -------------------------------------------------------------------------------- /ios/Flutter/Generated.xcconfig: -------------------------------------------------------------------------------- 1 | // This is a generated file; do not edit or check into version control. 2 | FLUTTER_ROOT=C:\src\flutter 3 | FLUTTER_APPLICATION_PATH=C:\Users\Ariel\Projects\Nihonoari-App 4 | COCOAPODS_PARALLEL_CODE_SIGN=true 5 | FLUTTER_TARGET=lib\main.dart 6 | FLUTTER_BUILD_DIR=build 7 | FLUTTER_BUILD_NAME=1.7.2 8 | FLUTTER_BUILD_NUMBER=12 9 | EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 10 | EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 11 | DART_OBFUSCATION=false 12 | TRACK_WIDGET_CREATION=true 13 | TREE_SHAKE_ICONS=false 14 | PACKAGE_CONFIG=.dart_tool/package_config.json 15 | -------------------------------------------------------------------------------- /ios/Flutter/flutter_export_environment.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # This is a generated file; do not edit or check into version control. 3 | export "FLUTTER_ROOT=C:\src\flutter" 4 | export "FLUTTER_APPLICATION_PATH=C:\Users\Ariel\Projects\Nihonoari-App" 5 | export "COCOAPODS_PARALLEL_CODE_SIGN=true" 6 | export "FLUTTER_TARGET=lib\main.dart" 7 | export "FLUTTER_BUILD_DIR=build" 8 | export "FLUTTER_BUILD_NAME=1.7.2" 9 | export "FLUTTER_BUILD_NUMBER=12" 10 | export "DART_OBFUSCATION=false" 11 | export "TRACK_WIDGET_CREATION=true" 12 | export "TREE_SHAKE_ICONS=false" 13 | export "PACKAGE_CONFIG=.dart_tool/package_config.json" 14 | -------------------------------------------------------------------------------- /ios/Runner/GeneratedPluginRegistrant.m: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #import "GeneratedPluginRegistrant.h" 8 | 9 | #if __has_include() 10 | #import 11 | #else 12 | @import shared_preferences_foundation; 13 | #endif 14 | 15 | @implementation GeneratedPluginRegistrant 16 | 17 | + (void)registerWithRegistry:(NSObject*)registry { 18 | [SharedPreferencesPlugin registerWithRegistrar:[registry registrarForPlugin:@"SharedPreferencesPlugin"]]; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/untitled/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.LAPARCELA.nihonoari 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | import android.content.Intent.getIntent 5 | 6 | import android.os.Bundle 7 | 8 | class MainActivity: FlutterActivity() { 9 | 10 | override fun onCreate(savedInstanceState: Bundle?) { 11 | 12 | /* 13 | if (Build.VERSION.SDK_INT < 20) { 14 | intent.putExtra("enable-software-rendering", true) 15 | getIntent().putExtra("enable-software-rendering", true); 16 | 17 | } 18 | */ 19 | 20 | // start Flutter 21 | super.onCreate(savedInstanceState) 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /i18n/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "main_licenses": "LICENSES", 3 | "main_hset": "Hiragana set", 4 | "main_kset": "Katakana set", 5 | "main_hiragana" : "Include Hiragana syllabary", 6 | "main_katakana" : "Include Katakana syllabary", 7 | "main_select": "Select one", 8 | "main_start": "Start", 9 | "quiz_stats": "Statistics", 10 | "quiz_total": "Total", 11 | "quiz_passed": "Passed", 12 | "quiz_failed": "Failed", 13 | "quiz_rate": "Success rate", 14 | "quiz_enter": "Input rōmaji", 15 | "quiz_correct": "Correct answer", 16 | "quiz_stoptit" : "Stop quiz", 17 | "quiz_stopmes" : "Return to the main menu?", 18 | "main_rset" : "Reverse", 19 | "main_reverse" : "Enter Kana", 20 | "quiz_enter_hira" : "Input hiragana", 21 | "quiz_enter_kata" : "Input katakana" 22 | } -------------------------------------------------------------------------------- /i18n/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "main_licenses": "Lizenzen", 3 | "main_hset": "Hiragana", 4 | "main_kset": "Katakana", 5 | "main_hiragana" : "Hiragana hinzufügen", 6 | "main_katakana" : "Katakana hinzufügen", 7 | "main_select": "Wähle eins aus", 8 | "main_start": "Start", 9 | "quiz_stats": "Statistiken", 10 | "quiz_total": "Alle", 11 | "quiz_passed": "Richtig", 12 | "quiz_failed": "Falsch", 13 | "quiz_rate": "Erfolgsrate", 14 | "quiz_enter": "Schreibe Rōmaji", 15 | "quiz_correct": "Antwort korrigieren", 16 | "quiz_stoptit" : "Quiz stoppen", 17 | "quiz_stopmes" : "Zurück zum Hauptmenü?", 18 | "main_rset" : "Rückwärts", 19 | "main_reverse" : "Schreibe Kana", 20 | "quiz_enter_hira" : "Schreibe Hiragana", 21 | "quiz_enter_kata" : "Schreibe Katakana" 22 | } 23 | -------------------------------------------------------------------------------- /i18n/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "main_licenses": "LICENCES", 3 | "main_hset": "Hiragana set", 4 | "main_kset": "Katakana set", 5 | "main_hiragana" : "Incorporer syllabaire Hiragana", 6 | "main_katakana" : "Incorporer syllabaire Katakana", 7 | "main_select": "Choisis", 8 | "main_start": "Commencer", 9 | "quiz_stats": "Statistiques", 10 | "quiz_total": "Total", 11 | "quiz_passed": "Coups", 12 | "quiz_failed": "Ratés", 13 | "quiz_rate": "Taux de succès", 14 | "quiz_enter": "Écris rōmaji", 15 | "quiz_correct": "Réponse correcte", 16 | "quiz_stoptit" : "Arrêter le test", 17 | "quiz_stopmes" : "Retour au menu principal?", 18 | "main_rset" : "Investi", 19 | "main_reverse" : "Écris Kana", 20 | "quiz_enter_hira" : "Écris hiragana", 21 | "quiz_enter_kata" : "Écris katakana" 22 | } 23 | -------------------------------------------------------------------------------- /i18n/be.json: -------------------------------------------------------------------------------- 1 | { 2 | "main_licenses": "ЛІЦЭНЗІІ", 3 | "main_hset": "Выбарка Хіраганы", 4 | "main_kset": "Выбарка Катаканы", 5 | "main_hiragana": "Уключыць склады Хіраганы", 6 | "main_katakana": "Уключыць склады Катаканы", 7 | "main_select": "Выбраць...", 8 | "main_start": "Пачаць", 9 | "quiz_stats": "Статыстыка", 10 | "quiz_total": "Усяго", 11 | "quiz_passed": "Правільна", 12 | "quiz_failed": "Няправільна", 13 | "quiz_rate": "Адсотак поспеху", 14 | "quiz_enter": "Увядзіце рамаджы", 15 | "quiz_correct": "Правільны адказ", 16 | "quiz_stoptit" : "Спыніць тэст", 17 | "quiz_stopmes" : "Вярнуцца ў галоўнае меню?", 18 | "main_rset" : "Reverse", 19 | "main_reverse" : "Enter Kana", 20 | "quiz_enter_hira" : "Увядзіце Хіраганы", 21 | "quiz_enter_kata" : "Увядзіце Катаканы" 22 | } -------------------------------------------------------------------------------- /i18n/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "main_licenses": "LICENCIAS", 3 | "main_hset": "Conjunto Hiragana", 4 | "main_kset": "Conjunto Katakana", 5 | "main_hiragana" : "Incluir silabario Hiragana", 6 | "main_katakana" : "Incluir silabario Katakana", 7 | "main_select": "Elige", 8 | "main_start": "Iniciar", 9 | "quiz_stats": "Estadísticas", 10 | "quiz_total": "Total", 11 | "quiz_passed": "Aciertos", 12 | "quiz_failed": "Fallos", 13 | "quiz_rate": "Tasa de acierto", 14 | "quiz_enter": "Escribe rōmaji", 15 | "quiz_correct": "Respuesta correcta", 16 | "quiz_stoptit" : "Detener prueba", 17 | "quiz_stopmes" : "¿Volver al menú principal?", 18 | "main_rset" : "Inversa", 19 | "main_reverse" : "Introduce Kana", 20 | "quiz_enter_hira" : "Escribe hiragana", 21 | "quiz_enter_kata" : "Escribe katakana" 22 | } -------------------------------------------------------------------------------- /i18n/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "main_licenses": "LİSANSLAR", 3 | "main_hset": "Hiragana seti", 4 | "main_kset": "Katakana seti", 5 | "main_hiragana" : "Hiragana karakterlerini kullan", 6 | "main_katakana" : "Katakana karakterlerini kullan", 7 | "main_select": "Birini seç", 8 | "main_start": "Başlat", 9 | "quiz_stats": "İstatistikler", 10 | "quiz_total": "Toplam", 11 | "quiz_passed": "Doğru", 12 | "quiz_failed": "Yanlış", 13 | "quiz_rate": "Başarı yüzdesi", 14 | "quiz_enter": "Rōmajisini yaz", 15 | "quiz_correct": "Doğru cevap", 16 | "quiz_stoptit" : "Testi durdur", 17 | "quiz_stopmes" : "Ana menüye dönmek istiyor musun?", 18 | "main_rset" : "Ters Mod", 19 | "main_reverse" : "Kanasını yaz", 20 | "quiz_enter_hira" : "Hiraganasını yaz", 21 | "quiz_enter_kata" : "Katakanasını yaz" 22 | } 23 | -------------------------------------------------------------------------------- /i18n/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "main_licenses": "ЛИЦЕНЗИИ", 3 | "main_hset": "Выборка Хираганы", 4 | "main_kset": "Выборка Катаканы", 5 | "main_hiragana" : "Включить слоги Хираганы", 6 | "main_katakana" : "Включить слоги Катаканы", 7 | "main_select": "Выберите что-то", 8 | "main_start": "Начать", 9 | "quiz_stats": "Статистика", 10 | "quiz_total": "Всего", 11 | "quiz_passed": "Пройдено", 12 | "quiz_failed": "Провалено", 13 | "quiz_rate": "Процент успеха", 14 | "quiz_enter": "Введите ромадзи/Кириллица", 15 | "quiz_correct": "Верный ответ", 16 | "quiz_stoptit" : "Остановить тест", 17 | "quiz_stopmes" : "Вернуться в главное меню?", 18 | "main_rset" : "Задний ход", 19 | "main_reverse" : "Введите Кана", 20 | "quiz_enter_hira" : "Введите Хираганы", 21 | "quiz_enter_kata" : "Введите Катаканы" 22 | } 23 | -------------------------------------------------------------------------------- /i18n/uk.json: -------------------------------------------------------------------------------- 1 | { 2 | "main_licenses": "ЛІЦЕНЗІЇ", 3 | "main_hset": "Вибірка Хірагани", 4 | "main_kset": "Вибірка Катакани", 5 | "main_hiragana" : "Включити склади Хіраґани", 6 | "main_katakana" : "Включити склади Катакани", 7 | "main_select": "Виберіть щось", 8 | "main_start": "Почати", 9 | "quiz_stats": "Статистика", 10 | "quiz_total": "Всього", 11 | "quiz_passed": "Правильних", 12 | "quiz_failed": "Помилкових", 13 | "quiz_rate": "Відсоток успіху", 14 | "quiz_enter": "Введіть ромадзі/Кирилиця", 15 | "quiz_correct": "Правильна відповідь", 16 | "quiz_stoptit" : "Зупинити тест", 17 | "quiz_stopmes" : "Повернутися в головне меню?", 18 | "main_rset" : "Reverse", 19 | "main_reverse" : "Введіть Кана", 20 | "quiz_enter_hira" : "Введіть Хіраґани", 21 | "quiz_enter_kata" : "Введіть Катакани" 22 | } 23 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | def flutterSdkPath = { 3 | def properties = new Properties() 4 | file("local.properties").withInputStream { properties.load(it) } 5 | def flutterSdkPath = properties.getProperty("flutter.sdk") 6 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 7 | return flutterSdkPath 8 | }() 9 | 10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") 11 | 12 | repositories { 13 | google() 14 | mavenCentral() 15 | gradlePluginPortal() 16 | } 17 | } 18 | 19 | plugins { 20 | id "dev.flutter.flutter-plugin-loader" version "1.0.0" 21 | id "com.android.application" version "7.2.1" apply false 22 | id "org.jetbrains.kotlin.android" version "1.6.10" apply false 23 | } 24 | 25 | include ":app" -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java: -------------------------------------------------------------------------------- 1 | package io.flutter.plugins; 2 | 3 | import androidx.annotation.Keep; 4 | import androidx.annotation.NonNull; 5 | import io.flutter.Log; 6 | 7 | import io.flutter.embedding.engine.FlutterEngine; 8 | 9 | /** 10 | * Generated file. Do not edit. 11 | * This file is generated by the Flutter tool based on the 12 | * plugins that support the Android platform. 13 | */ 14 | @Keep 15 | public final class GeneratedPluginRegistrant { 16 | private static final String TAG = "GeneratedPluginRegistrant"; 17 | public static void registerWith(@NonNull FlutterEngine flutterEngine) { 18 | try { 19 | flutterEngine.getPlugins().add(new io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin()); 20 | } catch (Exception e) { 21 | Log.e(TAG, "Error registering plugin shared_preferences_android, io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin", e); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /android/android.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /lib/Question.dart: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2020 Naval Alcalá 3 | 4 | This file is part of Nihonoari. 5 | 6 | Nihonoari is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Nihonoari is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Nihonoari. If not, see . 18 | */ 19 | 20 | class Question { 21 | String question = ""; 22 | List answer = []; 23 | String type = ""; 24 | 25 | Question(String q, List a, String t) { 26 | question = q; 27 | answer = List.from(a); 28 | type = t; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: nihonoari 2 | description: A little Japanese Kana training 3 | 4 | version: 1.8.0+13 5 | 6 | environment: 7 | sdk: '>=3.3.4 <4.0.0' 8 | 9 | dependencies: 10 | kana_kit: ^2.0.0 11 | font_awesome_flutter: ^10.7.0 12 | shared_preferences: ^2.2.3 13 | flutter: 14 | sdk: flutter 15 | flutter_localizations: 16 | sdk: flutter 17 | 18 | dev_dependencies: 19 | flutter_test: 20 | sdk: flutter 21 | 22 | 23 | flutter: 24 | fonts: 25 | - family: MP1P_MEDIUM 26 | fonts: 27 | - asset: assets/MPLUS1p-Medium.ttf 28 | - family: MP1P_REGULAR 29 | fonts: 30 | - asset: assets/MPLUS1p-Regular.ttf 31 | - family: MP1P_LIGHT 32 | fonts: 33 | - asset: assets/MPLUS1p-Light.ttf 34 | assets: 35 | - assets/LICENSES.txt 36 | - i18n/es.json 37 | - i18n/en.json 38 | - i18n/fr.json 39 | - i18n/uk.json 40 | - i18n/ru.json 41 | - i18n/tr.json 42 | - i18n/de.json 43 | - i18n/be.json 44 | - assets/data/hira.json 45 | - assets/data/kata.json 46 | 47 | uses-material-design: true 48 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 | # Nihonoari App 6 | Nihonoari is a Flutter based project to provide the community with a simple app to memorize and practice the Hiragana and Katakana alphabets without adverts, in-app purchases and useless functions, simpler is better. 7 | 8 | ## Simpler is better 9 | To recognize the Kana syllabary without difficulty is a costly task. While there are many applications in the market capable of helping with this task, only one has these characteristics: 10 | 11 | - Ultra minimalist funcionality and design. 12 | - Pure target, without useless addings. 13 | - No adverts. 14 | - No in-app purchases. 15 | - Open Source project under the GPL-3.0 license. 16 | 17 | ## Release 18 | 19 | Logo 21 | 22 | 23 | 24 | Logo 26 | 27 | ## Author 28 | 29 | * **Aeri** - *Project Nihonoari* - [aeri](https://github.com/aeri) 30 | 31 | ## Collaborators 32 | 33 | See the list of [contributors](https://github.com/aeri/Nihonoari-App/graphs/contributors) who participated in this project. 34 | 35 | ## License 36 | 37 | Code is released under the GNU General Public License v3.0. 38 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 16 | 20 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | quizzler 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /android/untitled_android.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /lib/UI.Utils/IconCreator.dart: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2020 Naval Alcalá 3 | 4 | This file is part of Nihonoari. 5 | 6 | Nihonoari is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Nihonoari is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Nihonoari. If not, see . 18 | */ 19 | 20 | import 'package:flutter/material.dart'; 21 | 22 | class IconCreator extends StatelessWidget { 23 | IconCreator(this.icon); 24 | 25 | final String icon; 26 | 27 | @override 28 | Widget build(BuildContext context) { 29 | return new Container( 30 | decoration: new BoxDecoration( 31 | color: Theme.of(context).colorScheme.secondary, 32 | borderRadius: new BorderRadius.circular(4.0), 33 | ), 34 | padding: EdgeInsets.symmetric(vertical: 1, horizontal: 1), 35 | //padding: new EdgeInsets.all(4.0), 36 | height: 25.0, 37 | width: 25.0, 38 | child: Align( 39 | alignment: Alignment.center, 40 | child: new Text( 41 | icon, 42 | style: new TextStyle( 43 | fontSize: 16.0, 44 | fontFamily: "MP1P_MEDIUM", 45 | fontStyle: FontStyle.normal, 46 | color: Theme.of(context).colorScheme.onSecondary, 47 | ), 48 | ), 49 | ), 50 | ); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.android.application" 3 | id "kotlin-android" 4 | id "dev.flutter.flutter-gradle-plugin" 5 | } 6 | 7 | def localProperties = new Properties() 8 | def localPropertiesFile = rootProject.file('local.properties') 9 | if (localPropertiesFile.exists()) { 10 | localPropertiesFile.withReader('UTF-8') { reader -> 11 | localProperties.load(reader) 12 | } 13 | } 14 | 15 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 16 | if (flutterVersionCode == null) { 17 | flutterVersionCode = '1' 18 | } 19 | 20 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 21 | if (flutterVersionName == null) { 22 | flutterVersionName = '1.0' 23 | } 24 | 25 | def keystoreProperties = new Properties() 26 | def keystorePropertiesFile = rootProject.file('key.properties') 27 | if (keystorePropertiesFile.exists()) { 28 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 29 | } 30 | 31 | android { 32 | 33 | compileOptions { 34 | sourceCompatibility JavaVersion.VERSION_1_8 35 | targetCompatibility JavaVersion.VERSION_1_8 36 | } 37 | 38 | kotlinOptions { 39 | jvmTarget = '1.8' 40 | } 41 | 42 | sourceSets { 43 | main.java.srcDirs += 'src/main/kotlin' 44 | } 45 | 46 | compileSdkVersion 34 47 | 48 | lintOptions { 49 | disable 'InvalidPackage' 50 | } 51 | 52 | defaultConfig { 53 | applicationId "com.LAPARCELA.nihonoari" 54 | minSdkVersion flutter.minSdkVersion 55 | targetSdkVersion 34 56 | versionCode flutterVersionCode.toInteger() 57 | versionName flutterVersionName 58 | } 59 | 60 | bundle { 61 | storeArchive { 62 | enable = false 63 | } 64 | } 65 | 66 | signingConfigs { 67 | release { 68 | keyAlias keystoreProperties['keyAlias'] 69 | keyPassword keystoreProperties['keyPassword'] 70 | storeFile file(keystoreProperties['storeFile']) 71 | storePassword keystoreProperties['storePassword'] 72 | } 73 | } 74 | buildTypes { 75 | release { 76 | signingConfig signingConfigs.release 77 | } 78 | } 79 | } 80 | 81 | flutter { 82 | source '../..' 83 | } -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /lib/Models/Transliteration.dart: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2020 Naval Alcalá 3 | 4 | This file is part of Nihonoari. 5 | 6 | Nihonoari is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Nihonoari is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Nihonoari. If not, see . 18 | */ 19 | 20 | import 'dart:convert'; 21 | 22 | Map> kanasFromJson(String str) => Map.from( 23 | json.decode(str)) 24 | .map((k, v) => MapEntry>(k, 25 | List.from(v.map((x) => Transliteration.fromJson(x))))); 26 | 27 | String kanasToJson(Map> data) => 28 | json.encode(Map.from(data).map((k, v) => MapEntry( 29 | k, List.from(v.map((x) => x.toJson()))))); 30 | 31 | class Transliteration { 32 | Transliteration({ 33 | this.system, 34 | this.value, 35 | }); 36 | 37 | System? system; 38 | String? value; 39 | 40 | factory Transliteration.fromJson(Map json) => 41 | Transliteration( 42 | system: systemValues.map[json["system"]], 43 | value: json["value"], 44 | ); 45 | 46 | Map toJson() => { 47 | "system": systemValues.reverse[system], 48 | "value": value, 49 | }; 50 | } 51 | 52 | enum System { 53 | Romaji, 54 | Bondarenko, 55 | Nakazawa, 56 | Fedorishyn, 57 | Gojuon, 58 | Kovalenko, 59 | Ruble, 60 | DibrovaOdinets, 61 | Polivanov 62 | } 63 | 64 | final systemValues = EnumValues({ 65 | "Бондаренко": System.Bondarenko, 66 | "Накадзава": System.Nakazawa, 67 | "Федоришин": System.Fedorishyn, 68 | "Система Ґоджюон": System.Gojuon, 69 | "Коваленко": System.Kovalenko, 70 | "Rōmaji": System.Romaji, 71 | "Рубель": System.Ruble, 72 | "Діброва-Одинець": System.DibrovaOdinets, 73 | "Поливанова": System.Polivanov 74 | }); 75 | 76 | class EnumValues { 77 | late Map map; 78 | late Map reverseMap; 79 | 80 | EnumValues(this.map); 81 | 82 | Map get reverse { 83 | reverseMap = map.map((k, v) => new MapEntry(v, k)); 84 | return reverseMap; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /lib/localizations.dart: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2020 Naval Alcalá 3 | 4 | This file is part of Nihonoari. 5 | 6 | Nihonoari is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Nihonoari is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Nihonoari. If not, see . 18 | */ 19 | 20 | import 'dart:async'; 21 | import 'dart:convert'; 22 | 23 | import 'package:flutter/material.dart'; 24 | import 'package:flutter/services.dart'; 25 | 26 | class AppLocalizations { 27 | final Locale locale; 28 | 29 | AppLocalizations(this.locale); 30 | 31 | // Helper method to keep the code in the widgets concise 32 | // Localizations are accessed using an InheritedWidget "of" syntax 33 | static AppLocalizations? of(BuildContext context) { 34 | return Localizations.of(context, AppLocalizations); 35 | } 36 | 37 | // Static member to have a simple access to the delegate from the MaterialApp 38 | static const LocalizationsDelegate delegate = 39 | _AppLocalizationsDelegate(); 40 | 41 | Map _localizedStrings = Map(); 42 | 43 | Future load() async { 44 | // Load the language JSON file from the "lang" folder 45 | String jsonString = 46 | await rootBundle.loadString('i18n/${locale.languageCode}.json'); 47 | Map jsonMap = json.decode(jsonString); 48 | 49 | _localizedStrings = jsonMap.map((key, value) { 50 | return MapEntry(key, value.toString()); 51 | }); 52 | 53 | return true; 54 | } 55 | 56 | // This method will be called from every widget which needs a localized text 57 | String? translate(String key) { 58 | return _localizedStrings[key]; 59 | } 60 | } 61 | 62 | class _AppLocalizationsDelegate 63 | extends LocalizationsDelegate { 64 | // This delegate instance will never change (it doesn't even have fields!) 65 | // It can provide a constant constructor. 66 | const _AppLocalizationsDelegate(); 67 | 68 | @override 69 | bool isSupported(Locale locale) { 70 | // Supported language codes here 71 | return ['en', 'es', 'fr', 'uk', 'ru', 'be', 'tr', 'de'].contains(locale.languageCode); 72 | 73 | } 74 | 75 | @override 76 | Future load(Locale locale) async { 77 | // AppLocalizations class is where the JSON loading actually runs 78 | AppLocalizations localizations = new AppLocalizations(locale); 79 | await localizations.load(); 80 | return localizations; 81 | } 82 | 83 | @override 84 | bool shouldReload(_AppLocalizationsDelegate old) => false; 85 | } 86 | -------------------------------------------------------------------------------- /lib/preferences.dart: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2020 Naval Alcalá 3 | 4 | This file is part of Nihonoari. 5 | 6 | Nihonoari is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Nihonoari is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Nihonoari. If not, see . 18 | */ 19 | import 'package:shared_preferences/shared_preferences.dart'; 20 | import 'dart:convert'; 21 | 22 | class AppPreferences { 23 | static Future get _instance async => 24 | _prefsInstance ??= await SharedPreferences.getInstance(); 25 | static SharedPreferences? _prefsInstance; 26 | 27 | static Future init() async { 28 | _prefsInstance = await _instance; 29 | return _prefsInstance; 30 | } 31 | 32 | static Map _defaultHiraganaSet = { 33 | 'あ い う え お': true, 34 | 'か き く け こ': true, 35 | 'さ し す せ そ': true, 36 | 'た ち つ て と': true, 37 | 'な に ぬ ね の': true, 38 | 'は ひ ふ へ ほ': true, 39 | 'ま み む め も': true, 40 | 'や ゆ よ': true, 41 | 'ら り る れ ろ': true, 42 | 'わ を': true, 43 | 'ん': true 44 | }; 45 | 46 | static Map _defaultKatakanaSet = { 47 | 'ア イ ウ エ オ': true, 48 | 'カ キ ク ケ コ': true, 49 | 'サ シ ス セ ソ': true, 50 | 'タ チ ツ テ ト': true, 51 | 'ナ ニ ヌ ネ ノ': true, 52 | 'ハ ヒ フ ヘ ホ': true, 53 | 'マ ミ ム メ モ': true, 54 | 'ヤ ユ ヨ': true, 55 | 'ラ リ ル レ ロ': true, 56 | 'ワ ヲ': true, 57 | 'ン': true, 58 | }; 59 | 60 | static final String _hirasolSet = "hiragana"; 61 | static final String _katasolSet = "katakana"; 62 | 63 | static String getHiraganaSet() { 64 | var hiraganaData = _prefsInstance?.getString(_hirasolSet); 65 | 66 | if (hiraganaData == null) { 67 | print("EMPTY HIRAGANA"); 68 | return json.encode(_defaultHiraganaSet); 69 | } else { 70 | print("EXISTS HIRAGANA"); 71 | return hiraganaData.replaceAll("\\t", " "); 72 | } 73 | } 74 | 75 | static Future setHiraganaSet(Map? value) async { 76 | return _prefsInstance!.setString(_hirasolSet, json.encode(value)); 77 | } 78 | 79 | static String getKatakanaSet() { 80 | var katakanaData = _prefsInstance?.getString(_katasolSet); 81 | 82 | if (katakanaData == null) { 83 | print("EMPTY KATAKANA"); 84 | return json.encode(_defaultKatakanaSet); 85 | } else { 86 | print("EXISTS KATAKANA"); 87 | return katakanaData.replaceAll("\\t", " "); 88 | } 89 | } 90 | 91 | static Future setKatakanaSet(Map? value) async { 92 | return await _prefsInstance!.setString(_katasolSet, json.encode(value)); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | {"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"}]} -------------------------------------------------------------------------------- /lib/Models/KanaList.dart: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2020 Naval Alcalá 3 | 4 | This file is part of Nihonoari. 5 | 6 | Nihonoari is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Nihonoari is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Nihonoari. If not, see . 18 | */ 19 | class KanaList { 20 | static Map hiragana = { 21 | "あ い う え お" : [ 22 | "あ", 23 | "い", 24 | "う", 25 | "え", 26 | "お" 27 | ], 28 | "か き く け こ" : [ 29 | "か", 30 | "き", 31 | "く", 32 | "け", 33 | "こ", 34 | "が", 35 | "ぎ", 36 | "ぐ", 37 | "げ", 38 | "ご" 39 | ], 40 | "さ し す せ そ" : [ 41 | "さ", 42 | "し", 43 | "す", 44 | "せ", 45 | "そ", 46 | "ざ", 47 | "じ", 48 | "ず", 49 | "ぜ", 50 | "ぞ" 51 | ], 52 | "た ち つ て と" : [ 53 | "た", 54 | "ち", 55 | "つ", 56 | "て", 57 | "と", 58 | "だ", 59 | "ぢ", 60 | "づ", 61 | "で", 62 | "ど" 63 | ], 64 | "な に ぬ ね の" : [ 65 | "な", 66 | "に", 67 | "ぬ", 68 | "ね", 69 | "の" 70 | ], 71 | "は ひ ふ へ ほ" : [ 72 | "は", 73 | "ひ", 74 | "ふ", 75 | "へ", 76 | "ほ", 77 | "ば", 78 | "び", 79 | "ぶ", 80 | "べ", 81 | "ぼ", 82 | "ぱ", 83 | "ぴ", 84 | "ぷ", 85 | "ぺ", 86 | "ぽ" 87 | ], 88 | "ま み む め も": [ 89 | "ま", 90 | "み", 91 | "む", 92 | "め", 93 | "も" 94 | ], 95 | "や ゆ よ" : [ 96 | "や", 97 | "ゆ", 98 | "よ" 99 | ], 100 | "ら り る れ ろ" : [ 101 | "ら", 102 | "り", 103 | "る", 104 | "れ", 105 | "ろ" 106 | ], 107 | "わ を" : [ 108 | "わ", 109 | "を" 110 | ], 111 | "ん": ["ん"] 112 | }; 113 | 114 | static Map katakana = { 115 | "ア イ ウ エ オ" : [ 116 | "ア", 117 | "イ", 118 | "ウ", 119 | "エ", 120 | "オ" 121 | ], 122 | "カ キ ク ケ コ" : [ 123 | "カ", 124 | "キ", 125 | "ク", 126 | "ケ", 127 | "コ", 128 | "ガ", 129 | "ギ", 130 | "グ", 131 | "ゲ", 132 | "ゴ" 133 | ], 134 | "サ シ ス セ ソ" : [ 135 | "サ", 136 | "シ", 137 | "ス", 138 | "セ", 139 | "ソ", 140 | "ザ", 141 | "ジ", 142 | "ズ", 143 | "ゼ", 144 | "ゾ" 145 | ], 146 | "タ チ ツ テ ト" : [ 147 | "タ", 148 | "チ", 149 | "ツ", 150 | "テ", 151 | "ト", 152 | "ダ", 153 | "ヂ", 154 | "ヅ", 155 | "デ", 156 | "ド" 157 | ], 158 | "ナ ニ ヌ ネ ノ" : [ 159 | "ナ", 160 | "ニ", 161 | "ヌ", 162 | "ネ", 163 | "ノ" 164 | ], 165 | "ハ ヒ フ ヘ ホ" : [ 166 | "ハ", 167 | "ヒ", 168 | "フ", 169 | "ヘ", 170 | "ホ", 171 | "バ", 172 | "ビ", 173 | "ブ", 174 | "ベ", 175 | "ボ", 176 | "パ", 177 | "ピ", 178 | "プ", 179 | "ペ", 180 | "ポ" 181 | ], 182 | "マ ミ ム メ モ" : [ 183 | "マ", 184 | "ミ", 185 | "ム", 186 | "メ", 187 | "モ" 188 | ], 189 | "ヤ ユ ヨ" : [ 190 | "ヤ", 191 | "ユ", 192 | "ヨ" 193 | ], 194 | "ラ リ ル レ ロ" : [ 195 | "ラ", 196 | "リ", 197 | "ル", 198 | "レ", 199 | "ロ" 200 | ], 201 | "ワ ヲ" : [ 202 | "ワ", 203 | "ヲ" 204 | ], 205 | "ン" : ["ン"] 206 | }; 207 | 208 | } -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 33 | 34 | 40 | 41 | 42 | 43 | 44 | 45 | 56 | 58 | 64 | 65 | 66 | 67 | 68 | 69 | 75 | 77 | 83 | 84 | 85 | 86 | 88 | 89 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /assets/LICENSES.txt: -------------------------------------------------------------------------------- 1 | Nihonoari 2 | Copyright (C) 2020 Naval Alcalá 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | 17 | 18 | THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY BE CONTAINED IN THIS APPLICATION. 19 | 20 | 21 | 22 | ===== 23 | 24 | 25 | 26 | 27 | kana_kit (https://github.com/jeroen-meijer/kana_kit) 28 | 29 | 30 | 31 | This software contains the following license and notice below: 32 | 33 | MIT License 34 | 35 | Copyright (c) 2020 Jeroen Meijer 36 | 37 | Permission is hereby granted, free of charge, to any person obtaining a copy 38 | of this software and associated documentation files (the "Software"), to deal 39 | in the Software without restriction, including without limitation the rights 40 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 41 | copies of the Software, and to permit persons to whom the Software is 42 | furnished to do so, subject to the following conditions: 43 | 44 | The above copyright notice and this permission notice shall be included in all 45 | copies or substantial portions of the Software. 46 | 47 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 48 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 49 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 50 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 51 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 52 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 53 | SOFTWARE. 54 | 55 | 56 | ===== 57 | 58 | 59 | 60 | 61 | font_awesome_flutter (https://github.com/fluttercommunity/font_awesome_flutter) 62 | 63 | This software contains the following license and notice below: 64 | 65 | MIT License 66 | 67 | Copyright (c) 2017 Brian Egan 68 | Font Awesome Icons by @fontawesome - https://fontawesome.com 69 | License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1) 70 | 71 | Permission is hereby granted, free of charge, to any person obtaining a copy 72 | of this software and associated documentation files (the "Software"), to deal 73 | in the Software without restriction, including without limitation the rights 74 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 75 | copies of the Software, and to permit persons to whom the Software is 76 | furnished to do so, subject to the following conditions: 77 | 78 | The above copyright notice and this permission notice shall be included in all 79 | copies or substantial portions of the Software. 80 | 81 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 82 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 83 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 84 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 85 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 86 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 87 | SOFTWARE. 88 | 89 | 90 | ===== 91 | 92 | 93 | 94 | 95 | shared_preferences (https://pub.dev/packages/shared_preferences) 96 | 97 | BSD-3-Clause 98 | Copyright 2013 The Flutter Authors. All rights reserved. 99 | 100 | Redistribution and use in source and binary forms, with or without modification, 101 | are permitted provided that the following conditions are met: 102 | 103 | * Redistributions of source code must retain the above copyright 104 | notice, this list of conditions and the following disclaimer. 105 | * Redistributions in binary form must reproduce the above 106 | copyright notice, this list of conditions and the following 107 | disclaimer in the documentation and/or other materials provided 108 | with the distribution. 109 | * Neither the name of Google Inc. nor the names of its 110 | contributors may be used to endorse or promote products derived 111 | from this software without specific prior written permission. 112 | 113 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 114 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 115 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 116 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 117 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 118 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 119 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 120 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 121 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 122 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 123 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /lib/table.dart: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2020 Naval Alcalá 3 | 4 | This file is part of Nihonoari. 5 | 6 | Nihonoari is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Nihonoari is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Nihonoari. If not, see . 18 | */ 19 | 20 | import 'package:flutter/material.dart'; 21 | import 'package:kana_kit/kana_kit.dart'; 22 | 23 | const kanaKit = KanaKit(); 24 | 25 | class BasicGridView extends StatelessWidget { 26 | @override 27 | Widget build(BuildContext context) { 28 | return Scaffold( 29 | body: Center( 30 | child: Padding( 31 | padding: const EdgeInsets.all(15.0), 32 | child: GridView( 33 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( 34 | //crossAxisCount: The number of children in the cross axis. 35 | crossAxisCount: 6, 36 | childAspectRatio: 1.0, 37 | mainAxisSpacing: 5.0, 38 | crossAxisSpacing: 5.0, 39 | ), 40 | //specify the list of children for the grid 41 | children: [ 42 | _emptyContainer(), 43 | _columnContainer("a"), 44 | _columnContainer("i"), 45 | _columnContainer("u"), 46 | _columnContainer("e"), 47 | _columnContainer("o"), 48 | _columnContainer("a"), 49 | _buildContainer("a"), 50 | _buildContainer("i"), 51 | _buildContainer("u"), 52 | _buildContainer("e"), 53 | _buildContainer("o"), 54 | _columnContainer("k"), 55 | _buildContainer("ka"), 56 | _buildContainer("ki"), 57 | _buildContainer("ku"), 58 | _buildContainer("ke"), 59 | _buildContainer("ko"), 60 | _columnContainer("s"), 61 | _buildContainer("sa"), 62 | _buildContainer("shi"), 63 | _buildContainer("su"), 64 | _buildContainer("se"), 65 | _buildContainer("so"), 66 | _columnContainer("t"), 67 | _buildContainer("ta"), 68 | _buildContainer("chi"), 69 | _buildContainer("tsu"), 70 | _buildContainer("te"), 71 | _buildContainer("to"), 72 | _columnContainer("n"), 73 | _buildContainer("na"), 74 | _buildContainer("ni"), 75 | _buildContainer("nu"), 76 | _buildContainer("ne"), 77 | _buildContainer("no"), 78 | _columnContainer("h"), 79 | _buildContainer("ha"), 80 | _buildContainer("hi"), 81 | _buildContainer("fu"), 82 | _buildContainer("he"), 83 | _buildContainer("ho"), 84 | _columnContainer("m"), 85 | _buildContainer("ma"), 86 | _buildContainer("mi"), 87 | _buildContainer("mu"), 88 | _buildContainer("me"), 89 | _buildContainer("mo"), 90 | _columnContainer("y"), 91 | _buildContainer("ya"), 92 | _emptyContainer(), 93 | _buildContainer("yu"), 94 | _emptyContainer(), 95 | _buildContainer("yo"), 96 | _columnContainer("r"), 97 | _buildContainer("ra"), 98 | _buildContainer("ri"), 99 | _buildContainer("ru"), 100 | _buildContainer("re"), 101 | _buildContainer("ro"), 102 | _columnContainer("w"), 103 | _buildContainer("wa"), 104 | _emptyContainer(), 105 | _emptyContainer(), 106 | _emptyContainer(), 107 | _buildContainer("wo"), 108 | _emptyContainer(), 109 | _buildContainer("n"), 110 | ], 111 | //specify direction in which it scrolls (horizontal or vertical). 112 | //scrollDirection: Axis.horizontal, 113 | ), 114 | ), 115 | ), 116 | ); 117 | } 118 | 119 | Widget _buildContainer(String hira) { 120 | return Container( 121 | height: 50.0, 122 | width: 60.0, 123 | color: Colors.grey.shade200, 124 | child: Center( 125 | child: Text.rich( 126 | TextSpan( 127 | text: kanaKit.toHiragana(hira), 128 | style: TextStyle( 129 | color: Colors.black, 130 | fontFamily: "MP1P_MEDIUM", 131 | fontStyle: FontStyle.normal, 132 | fontSize: 16, 133 | ), 134 | children: [ 135 | TextSpan( 136 | text: '\n${kanaKit.toKatakana(hira)} ', 137 | style: TextStyle( 138 | //fontWeight: FontWeight.bold, 139 | color: Colors.grey.shade700, 140 | fontSize: 15)), 141 | TextSpan( 142 | text: ' $hira', 143 | style: TextStyle( 144 | //fontStyle: FontStyle.italic, 145 | color: Colors.grey.shade700, 146 | fontSize: 13)), 147 | ], 148 | ), 149 | textAlign: TextAlign.center, 150 | ))); 151 | } 152 | 153 | Widget _columnContainer(String deep) { 154 | return Container( 155 | height: 50.0, 156 | width: 60.0, 157 | color: Colors.grey.shade200, 158 | child: Center( 159 | child: Text.rich( 160 | TextSpan( 161 | text: deep, 162 | style: TextStyle( 163 | color: Colors.redAccent, 164 | fontSize: 20, 165 | fontFamily: "MP1P_MEDIUM", 166 | ), 167 | ), 168 | textAlign: TextAlign.center, 169 | ))); 170 | } 171 | 172 | Widget _emptyContainer() { 173 | return Container( 174 | height: 50.0, 175 | width: 60.0, 176 | color: Colors.grey.shade200, 177 | ); 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /lib/quiz_engine.dart: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2020 Naval Alcalá 3 | 4 | This file is part of Nihonoari. 5 | 6 | Nihonoari is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Nihonoari is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Nihonoari. If not, see . 18 | */ 19 | 20 | import 'package:nihonoari/Models/Transliteration.dart'; 21 | import 'Question.dart'; 22 | import 'Models/KanaList.dart'; 23 | import 'Models/GlobalKanas.dart'; 24 | import 'dart:math'; 25 | 26 | class QuizBrain { 27 | static var rng = new Random(); 28 | static bool h = true, k = true, re = true; 29 | static Question currentQuestion = Question("", [], ""); 30 | 31 | static List _quiz = []; 32 | static List _passed = []; 33 | static List _failed = []; 34 | 35 | static void nextQuestion(bool passed) { 36 | if (passed) { 37 | _passed.add(currentQuestion); 38 | _quiz.remove(currentQuestion); 39 | } else { 40 | _failed.add(currentQuestion); 41 | _quiz.remove(currentQuestion); 42 | } 43 | 44 | if (_quiz.length == 0) { 45 | if (_failed.length == 0) { 46 | _quiz.addAll(_passed); 47 | _passed.clear(); 48 | } else { 49 | _quiz.addAll(_failed); 50 | _failed.clear(); 51 | } 52 | } 53 | int _questionNumber = rng.nextInt(_quiz.length); 54 | currentQuestion = _quiz[_questionNumber] ?? Question("", [], ""); 55 | } 56 | 57 | static void firstQuestion() { 58 | int _questionNumber = rng.nextInt(_quiz.length); 59 | currentQuestion = _quiz[_questionNumber] ?? Question("", [], ""); 60 | } 61 | 62 | static void clearList() { 63 | _quiz.clear(); 64 | _passed.clear(); 65 | _failed.clear(); 66 | } 67 | 68 | static void setList(bool h, Map hv, bool k, 69 | Map kv, bool isReverse, String locale) { 70 | QuizBrain.h = h; 71 | QuizBrain.k = k; 72 | QuizBrain.re = isReverse; 73 | 74 | List hiraganaAnswers = []; 75 | List hiraganaQuestions = []; 76 | List katakanaAnswers = []; 77 | List katakanaQuestions = []; 78 | 79 | if (h) { 80 | hv = Map.from(hv)..removeWhere((k, v) => v == false); 81 | hv.forEach( 82 | (k, v) { 83 | List? hiraganaSetList = KanaList.hiragana[k]; 84 | if (hiraganaSetList != null) { 85 | hiraganaSetList.forEach( 86 | (x) { 87 | hiraganaAnswers.clear(); 88 | hiraganaQuestions.clear(); 89 | 90 | switch (locale.split('_').first) { 91 | case "uk": 92 | { 93 | hiraganaAnswers = (GlobalKanas.hiraganaMap[x] 94 | ?.where((y) => 95 | y.system == System.Kovalenko || 96 | y.system == System.DibrovaOdinets || 97 | y.system == System.Bondarenko || 98 | y.system == System.Romaji) 99 | .map((e) => e.value) 100 | .toList()) ?? 101 | []; 102 | } 103 | break; 104 | case "ru": 105 | { 106 | hiraganaAnswers = (GlobalKanas.hiraganaMap[x] 107 | ?.where((y) => 108 | y.system == System.Polivanov || 109 | y.system == System.Romaji) 110 | .map((e) => e.value) 111 | .toList()) ?? 112 | []; 113 | } 114 | break; 115 | default: 116 | { 117 | hiraganaAnswers = (GlobalKanas.hiraganaMap[x] 118 | ?.where((y) => y.system == System.Romaji) 119 | .map((e) => e.value) 120 | .toList()) ?? 121 | []; 122 | } 123 | break; 124 | } 125 | 126 | if (re) { 127 | // https://github.com/aeri/Nihonoari-App/issues/33 128 | // enable distinguishing `ji` 129 | if (x == "じ") { 130 | hiraganaQuestions.add("ぢ"); 131 | } 132 | if (x == "ぢ") { 133 | hiraganaQuestions.add("じ"); 134 | } 135 | // enable distinguishing `zu` 136 | if (x == "ず") { 137 | hiraganaQuestions.add("づ"); 138 | } 139 | if (x == "づ") { 140 | hiraganaQuestions.add("ず"); 141 | } 142 | hiraganaQuestions.add(x); 143 | _quiz.add(Question(hiraganaAnswers.last ?? "", 144 | hiraganaQuestions, "hiragana")); 145 | } else { 146 | _quiz.add(Question(x, hiraganaAnswers, "hiragana")); 147 | } 148 | }, 149 | ); 150 | } else { 151 | print("Bad hiragana configuration: " + k); 152 | } 153 | }, 154 | ); 155 | } 156 | 157 | if (k) { 158 | kv = Map.from(kv)..removeWhere((k, v) => v == false); 159 | 160 | kv.forEach((k, v) { 161 | List? katakanaSetList = KanaList.katakana[k]; 162 | if (katakanaSetList != null) { 163 | katakanaSetList.forEach( 164 | (x) { 165 | katakanaAnswers.clear(); 166 | katakanaQuestions.clear(); 167 | 168 | switch (locale.split('_').first) { 169 | case "uk": 170 | { 171 | katakanaAnswers = (GlobalKanas.katakanaMap[x] 172 | ?.where((y) => 173 | y.system == System.Kovalenko || 174 | y.system == System.DibrovaOdinets || 175 | y.system == System.Bondarenko || 176 | y.system == System.Romaji) 177 | .map((e) => e.value) 178 | .toList()) ?? 179 | []; 180 | } 181 | break; 182 | case "ru": 183 | { 184 | katakanaAnswers = (GlobalKanas.katakanaMap[x] 185 | ?.where((y) => 186 | y.system == System.Polivanov || 187 | y.system == System.Romaji) 188 | .map((e) => e.value) 189 | .toList()) ?? 190 | []; 191 | } 192 | break; 193 | default: 194 | { 195 | katakanaAnswers = (GlobalKanas.katakanaMap[x] 196 | ?.where((y) => y.system == System.Romaji) 197 | .map((e) => e.value) 198 | .toList()) ?? 199 | []; 200 | } 201 | break; 202 | } 203 | 204 | if (re) { 205 | // https://github.com/aeri/Nihonoari-App/issues/33 206 | // enable distinguishing `ji` 207 | if (x == "ジ") { 208 | katakanaQuestions.add("ヂ"); 209 | } 210 | if (x == "ヂ") { 211 | katakanaQuestions.add("ジ"); 212 | } 213 | // enable distinguishing `zu` 214 | if (x == "ズ") { 215 | katakanaQuestions.add("ヅ"); 216 | } 217 | if (x == "ヅ") { 218 | katakanaQuestions.add("ズ"); 219 | } 220 | katakanaQuestions.add(x); 221 | _quiz.add(Question( 222 | katakanaAnswers.last ?? "", katakanaQuestions, "katakana")); 223 | } else { 224 | _quiz.add(Question(x, katakanaAnswers, "katakana")); 225 | } 226 | }, 227 | ); 228 | } else { 229 | print("Bad katakana configuration: " + k); 230 | } 231 | }); 232 | } 233 | firstQuestion(); 234 | } 235 | } 236 | -------------------------------------------------------------------------------- /assets/data/hira.json: -------------------------------------------------------------------------------- 1 | {"あ":[{"system":"Rōmaji","value":"a"},{"system":"Бондаренко","value":"а"},{"system":"Діброва-Одинець","value":"а"},{"system":"Коваленко","value":"а"},{"system":"Поливанова","value":"а"}],"い":[{"system":"Rōmaji","value":"i"},{"system":"Бондаренко","value":"і"},{"system":"Діброва-Одинець","value":"і"},{"system":"Коваленко","value":"і"},{"system":"Поливанова","value":"и"}],"う":[{"system":"Rōmaji","value":"u"},{"system":"Бондаренко","value":"у"},{"system":"Діброва-Одинець","value":"у"},{"system":"Коваленко","value":"у"},{"system":"Поливанова","value":"у"}],"え":[{"system":"Rōmaji","value":"e"},{"system":"Бондаренко","value":"е"},{"system":"Діброва-Одинець","value":"е"},{"system":"Коваленко","value":"е"},{"system":"Поливанова","value":"э"}],"お":[{"system":"Rōmaji","value":"o"},{"system":"Бондаренко","value":"о"},{"system":"Діброва-Одинець","value":"о"},{"system":"Коваленко","value":"о"},{"system":"Поливанова","value":"о"}],"や":[{"system":"Rōmaji","value":"ya"},{"system":"Бондаренко","value":"я"},{"system":"Діброва-Одинець","value":"я"},{"system":"Коваленко","value":"я"},{"system":"Поливанова","value":"я"}],"ゆ":[{"system":"Rōmaji","value":"yu"},{"system":"Бондаренко","value":"ю"},{"system":"Діброва-Одинець","value":"ю"},{"system":"Коваленко","value":"ю"},{"system":"Поливанова","value":"ю"}],"よ":[{"system":"Rōmaji","value":"yo"},{"system":"Бондаренко","value":"йо"},{"system":"Діброва-Одинець","value":"йо"},{"system":"Коваленко","value":"йо"},{"system":"Поливанова","value":"ё"}],"か":[{"system":"Rōmaji","value":"ka"},{"system":"Бондаренко","value":"ка"},{"system":"Діброва-Одинець","value":"ка"},{"system":"Коваленко","value":"ка"},{"system":"Поливанова","value":"ка"}],"き":[{"system":"Rōmaji","value":"ki"},{"system":"Бондаренко","value":"кі"},{"system":"Діброва-Одинець","value":"кі"},{"system":"Коваленко","value":"кі"},{"system":"Поливанова","value":"ки"}],"く":[{"system":"Rōmaji","value":"ku"},{"system":"Бондаренко","value":"ку"},{"system":"Діброва-Одинець","value":"ку"},{"system":"Коваленко","value":"ку"},{"system":"Поливанова","value":"ку"}],"け":[{"system":"Rōmaji","value":"ke"},{"system":"Бондаренко","value":"ке"},{"system":"Діброва-Одинець","value":"ке"},{"system":"Коваленко","value":"ке"},{"system":"Поливанова","value":"кэ"}],"こ":[{"system":"Rōmaji","value":"ko"},{"system":"Бондаренко","value":"ко"},{"system":"Діброва-Одинець","value":"ко"},{"system":"Коваленко","value":"ко"},{"system":"Поливанова","value":"ко"}],"さ":[{"system":"Rōmaji","value":"sa"},{"system":"Бондаренко","value":"са"},{"system":"Діброва-Одинець","value":"са"},{"system":"Коваленко","value":"са"},{"system":"Поливанова","value":"са"}],"し":[{"system":"Rōmaji","value":"shi"},{"system":"Бондаренко","value":"сі"},{"system":"Діброва-Одинець","value":"ші"},{"system":"Коваленко","value":"ші"},{"system":"Поливанова","value":"си"}],"す":[{"system":"Rōmaji","value":"su"},{"system":"Бондаренко","value":"су"},{"system":"Діброва-Одинець","value":"су"},{"system":"Коваленко","value":"су"},{"system":"Поливанова","value":"су"}],"せ":[{"system":"Rōmaji","value":"se"},{"system":"Бондаренко","value":"се"},{"system":"Діброва-Одинець","value":"се"},{"system":"Коваленко","value":"се"},{"system":"Поливанова","value":"сэ"}],"そ":[{"system":"Rōmaji","value":"so"},{"system":"Бондаренко","value":"со"},{"system":"Діброва-Одинець","value":"со"},{"system":"Коваленко","value":"со"},{"system":"Поливанова","value":"со"}],"た":[{"system":"Rōmaji","value":"ta"},{"system":"Бондаренко","value":"та"},{"system":"Діброва-Одинець","value":"та"},{"system":"Коваленко","value":"та"},{"system":"Поливанова","value":"та"}],"ち":[{"system":"Rōmaji","value":"chi"},{"system":"Бондаренко","value":"ті"},{"system":"Діброва-Одинець","value":"чі"},{"system":"Коваленко","value":"чі"},{"system":"Поливанова","value":"ти"}],"つ":[{"system":"Rōmaji","value":"tsu"},{"system":"Бондаренко","value":"цу"},{"system":"Діброва-Одинець","value":"цу"},{"system":"Коваленко","value":"цу"},{"system":"Поливанова","value":"цу"}],"て":[{"system":"Rōmaji","value":"te"},{"system":"Бондаренко","value":"те"},{"system":"Діброва-Одинець","value":"те"},{"system":"Коваленко","value":"те"},{"system":"Поливанова","value":"тэ"}],"と":[{"system":"Rōmaji","value":"to"},{"system":"Бондаренко","value":"то"},{"system":"Діброва-Одинець","value":"то"},{"system":"Коваленко","value":"то"},{"system":"Поливанова","value":"то"}],"な":[{"system":"Rōmaji","value":"na"},{"system":"Бондаренко","value":"на"},{"system":"Діброва-Одинець","value":"на"},{"system":"Коваленко","value":"на"},{"system":"Поливанова","value":"на"}],"に":[{"system":"Rōmaji","value":"ni"},{"system":"Бондаренко","value":"ні"},{"system":"Діброва-Одинець","value":"ні"},{"system":"Коваленко","value":"ні"},{"system":"Поливанова","value":"ни"}],"ぬ":[{"system":"Rōmaji","value":"nu"},{"system":"Бондаренко","value":"ну"},{"system":"Діброва-Одинець","value":"ну"},{"system":"Коваленко","value":"ну"},{"system":"Поливанова","value":"ну"}],"ね":[{"system":"Rōmaji","value":"ne"},{"system":"Бондаренко","value":"не"},{"system":"Діброва-Одинець","value":"не"},{"system":"Коваленко","value":"не"},{"system":"Поливанова","value":"нэ"}],"の":[{"system":"Rōmaji","value":"no"},{"system":"Бондаренко","value":"но"},{"system":"Діброва-Одинець","value":"но"},{"system":"Коваленко","value":"но"},{"system":"Поливанова","value":"но"}],"は":[{"system":"Rōmaji","value":"ha"},{"system":"Бондаренко","value":"ха"},{"system":"Діброва-Одинець","value":"ха"},{"system":"Коваленко","value":"ха"},{"system":"Поливанова","value":"ха"}],"ひ":[{"system":"Rōmaji","value":"hi"},{"system":"Бондаренко","value":"хі"},{"system":"Діброва-Одинець","value":"хі"},{"system":"Коваленко","value":"хі"},{"system":"Поливанова","value":"хи"}],"ふ":[{"system":"Rōmaji","value":"fu"},{"system":"Бондаренко","value":"фу"},{"system":"Діброва-Одинець","value":"фу"},{"system":"Коваленко","value":"фу"},{"system":"Поливанова","value":"фу"}],"へ":[{"system":"Rōmaji","value":"he"},{"system":"Бондаренко","value":"хе"},{"system":"Діброва-Одинець","value":"хе"},{"system":"Коваленко","value":"хе"},{"system":"Поливанова","value":"хэ"}],"ほ":[{"system":"Rōmaji","value":"ho"},{"system":"Бондаренко","value":"хо"},{"system":"Діброва-Одинець","value":"хо"},{"system":"Коваленко","value":"хо"},{"system":"Поливанова","value":"хо"}],"ま":[{"system":"Rōmaji","value":"ma"},{"system":"Бондаренко","value":"ма"},{"system":"Діброва-Одинець","value":"ма"},{"system":"Коваленко","value":"ма"},{"system":"Поливанова","value":"ма"}],"み":[{"system":"Rōmaji","value":"mi"},{"system":"Бондаренко","value":"мі"},{"system":"Діброва-Одинець","value":"мі"},{"system":"Коваленко","value":"мі"},{"system":"Поливанова","value":"ми"}],"む":[{"system":"Rōmaji","value":"mu"},{"system":"Бондаренко","value":"му"},{"system":"Діброва-Одинець","value":"му"},{"system":"Коваленко","value":"му"},{"system":"Поливанова","value":"му"}],"め":[{"system":"Rōmaji","value":"me"},{"system":"Бондаренко","value":"ме"},{"system":"Діброва-Одинець","value":"ме"},{"system":"Коваленко","value":"ме"},{"system":"Поливанова","value":"мэ"}],"も":[{"system":"Rōmaji","value":"mo"},{"system":"Бондаренко","value":"мо"},{"system":"Діброва-Одинець","value":"мо"},{"system":"Коваленко","value":"мо"},{"system":"Поливанова","value":"мо"}],"ら":[{"system":"Rōmaji","value":"ra"},{"system":"Бондаренко","value":"ра"},{"system":"Діброва-Одинець","value":"ра"},{"system":"Коваленко","value":"ра"},{"system":"Поливанова","value":"ра"}],"り":[{"system":"Rōmaji","value":"ri"},{"system":"Бондаренко","value":"рі"},{"system":"Діброва-Одинець","value":"рі"},{"system":"Коваленко","value":"рі"},{"system":"Поливанова","value":"ри"}],"る":[{"system":"Rōmaji","value":"ru"},{"system":"Бондаренко","value":"ру"},{"system":"Діброва-Одинець","value":"ру"},{"system":"Коваленко","value":"ру"},{"system":"Поливанова","value":"ру"}],"れ":[{"system":"Rōmaji","value":"re"},{"system":"Бондаренко","value":"ре"},{"system":"Діброва-Одинець","value":"ре"},{"system":"Коваленко","value":"ре"},{"system":"Поливанова","value":"рэ"}],"ろ":[{"system":"Rōmaji","value":"ro"},{"system":"Бондаренко","value":"ро"},{"system":"Діброва-Одинець","value":"ро"},{"system":"Коваленко","value":"ро"},{"system":"Поливанова","value":"ро"}],"わ":[{"system":"Rōmaji","value":"wa"},{"system":"Бондаренко","value":"ва"},{"system":"Діброва-Одинець","value":"ва"},{"system":"Коваленко","value":"ва"},{"system":"Поливанова","value":"ва"}],"を":[{"system":"Rōmaji","value":"wo"},{"system":"Бондаренко","value":"о"},{"system":"Діброва-Одинець","value":"о"},{"system":"Коваленко","value":"о"},{"system":"Поливанова","value":"о"}],"ん":[{"system":"Rōmaji","value":"n"},{"system":"Бондаренко","value":"н"},{"system":"Діброва-Одинець","value":"н"},{"system":"Коваленко","value":"н"},{"system":"Поливанова","value":"н"}],"が":[{"system":"Rōmaji","value":"ga"},{"system":"Бондаренко","value":"ґа"},{"system":"Діброва-Одинець","value":"ґа"},{"system":"Коваленко","value":"ґа"},{"system":"Поливанова","value":"га"}],"ぎ":[{"system":"Rōmaji","value":"gi"},{"system":"Бондаренко","value":"ґі"},{"system":"Діброва-Одинець","value":"ґі"},{"system":"Коваленко","value":"ґі"},{"system":"Поливанова","value":"ги"}],"ぐ":[{"system":"Rōmaji","value":"gu"},{"system":"Бондаренко","value":"ґу"},{"system":"Діброва-Одинець","value":"ґу"},{"system":"Коваленко","value":"ґу"},{"system":"Поливанова","value":"гу"}],"げ":[{"system":"Rōmaji","value":"ge"},{"system":"Бондаренко","value":"ґе"},{"system":"Діброва-Одинець","value":"ґе"},{"system":"Коваленко","value":"ґе"},{"system":"Поливанова","value":"гэ"}],"ご":[{"system":"Rōmaji","value":"go"},{"system":"Бондаренко","value":"ґо"},{"system":"Діброва-Одинець","value":"ґо"},{"system":"Коваленко","value":"ґо"},{"system":"Поливанова","value":"го"}],"ざ":[{"system":"Rōmaji","value":"za"},{"system":"Бондаренко","value":"дза"},{"system":"Діброва-Одинець","value":"дза"},{"system":"Коваленко","value":"дза"},{"system":"Поливанова","value":"дза"}],"じ":[{"system":"Rōmaji","value":"ji"},{"system":"Бондаренко","value":"дзі"},{"system":"Діброва-Одинець","value":"дзі"},{"system":"Коваленко","value":"джі"},{"system":"Поливанова","value":"дзи"}],"ず":[{"system":"Rōmaji","value":"zu"},{"system":"Бондаренко","value":"дзу"},{"system":"Діброва-Одинець","value":"дзу"},{"system":"Коваленко","value":"дзу"},{"system":"Поливанова","value":"дзу"}],"ぜ":[{"system":"Rōmaji","value":"ze"},{"system":"Бондаренко","value":"дзе"},{"system":"Діброва-Одинець","value":"дзе"},{"system":"Коваленко","value":"дзе"},{"system":"Поливанова","value":"дзэ"}],"ぞ":[{"system":"Rōmaji","value":"zo"},{"system":"Бондаренко","value":"дзо"},{"system":"Діброва-Одинець","value":"дзо"},{"system":"Коваленко","value":"дзо"},{"system":"Поливанова","value":"дзо"}],"だ":[{"system":"Rōmaji","value":"da"},{"system":"Бондаренко","value":"да"},{"system":"Діброва-Одинець","value":"да"},{"system":"Коваленко","value":"да"},{"system":"Поливанова","value":"да"}],"ぢ":[{"system":"Rōmaji","value":"ji"},{"system":"Бондаренко","value":"дзі"},{"system":"Діброва-Одинець","value":"дзі"},{"system":"Коваленко","value":"джі"},{"system":"Поливанова","value":"дзи"}],"づ":[{"system":"Rōmaji","value":"zu"},{"system":"Бондаренко","value":"дзу"},{"system":"Діброва-Одинець","value":"дзу"},{"system":"Коваленко","value":"дзу"},{"system":"Поливанова","value":"дзу"}],"で":[{"system":"Rōmaji","value":"de"},{"system":"Бондаренко","value":"де"},{"system":"Діброва-Одинець","value":"де"},{"system":"Коваленко","value":"де"},{"system":"Поливанова","value":"дэ"}],"ど":[{"system":"Rōmaji","value":"do"},{"system":"Бондаренко","value":"до"},{"system":"Діброва-Одинець","value":"до"},{"system":"Коваленко","value":"до"},{"system":"Поливанова","value":"до"}],"ば":[{"system":"Rōmaji","value":"ba"},{"system":"Бондаренко","value":"ба"},{"system":"Діброва-Одинець","value":"ба"},{"system":"Коваленко","value":"ба"},{"system":"Поливанова","value":"ба"}],"び":[{"system":"Rōmaji","value":"bi"},{"system":"Бондаренко","value":"бі"},{"system":"Діброва-Одинець","value":"бі"},{"system":"Коваленко","value":"бі"},{"system":"Поливанова","value":"би"}],"ぶ":[{"system":"Rōmaji","value":"bu"},{"system":"Бондаренко","value":"бу"},{"system":"Діброва-Одинець","value":"бу"},{"system":"Коваленко","value":"бу"},{"system":"Поливанова","value":"бу"}],"べ":[{"system":"Rōmaji","value":"be"},{"system":"Бондаренко","value":"бе"},{"system":"Діброва-Одинець","value":"бе"},{"system":"Коваленко","value":"бе"},{"system":"Поливанова","value":"бэ"}],"ぼ":[{"system":"Rōmaji","value":"bo"},{"system":"Бондаренко","value":"бо"},{"system":"Діброва-Одинець","value":"бо"},{"system":"Коваленко","value":"бо"},{"system":"Поливанова","value":"бо"}],"ぱ":[{"system":"Rōmaji","value":"pa"},{"system":"Бондаренко","value":"па"},{"system":"Діброва-Одинець","value":"па"},{"system":"Коваленко","value":"па"},{"system":"Поливанова","value":"па"}],"ぴ":[{"system":"Rōmaji","value":"pi"},{"system":"Бондаренко","value":"пі"},{"system":"Діброва-Одинець","value":"пі"},{"system":"Коваленко","value":"пі"},{"system":"Поливанова","value":"пи"}],"ぷ":[{"system":"Rōmaji","value":"pu"},{"system":"Бондаренко","value":"пу"},{"system":"Діброва-Одинець","value":"пу"},{"system":"Коваленко","value":"пу"},{"system":"Поливанова","value":"пу"}],"ぺ":[{"system":"Rōmaji","value":"pe"},{"system":"Бондаренко","value":"пе"},{"system":"Діброва-Одинець","value":"пе"},{"system":"Коваленко","value":"пе"},{"system":"Поливанова","value":"пэ"}],"ぽ":[{"system":"Rōmaji","value":"po"},{"system":"Бондаренко","value":"по"},{"system":"Діброва-Одинець","value":"по"},{"system":"Коваленко","value":"по"},{"system":"Поливанова","value":"по"}]} -------------------------------------------------------------------------------- /assets/data/kata.json: -------------------------------------------------------------------------------- 1 | {"ア":[{"system":"Rōmaji","value":"a"},{"system":"Бондаренко","value":"а"},{"system":"Діброва-Одинець","value":"а"},{"system":"Коваленко","value":"а"},{"system":"Поливанова","value":"а"}],"イ":[{"system":"Rōmaji","value":"i"},{"system":"Бондаренко","value":"і"},{"system":"Діброва-Одинець","value":"і"},{"system":"Коваленко","value":"і"},{"system":"Поливанова","value":"и"}],"ウ":[{"system":"Rōmaji","value":"u"},{"system":"Бондаренко","value":"у"},{"system":"Діброва-Одинець","value":"у"},{"system":"Коваленко","value":"у"},{"system":"Поливанова","value":"у"}],"エ":[{"system":"Rōmaji","value":"e"},{"system":"Бондаренко","value":"е"},{"system":"Діброва-Одинець","value":"е"},{"system":"Коваленко","value":"е"},{"system":"Поливанова","value":"э"}],"オ":[{"system":"Rōmaji","value":"o"},{"system":"Бондаренко","value":"о"},{"system":"Діброва-Одинець","value":"о"},{"system":"Коваленко","value":"о"},{"system":"Поливанова","value":"о"}],"ヤ":[{"system":"Rōmaji","value":"ya"},{"system":"Бондаренко","value":"я"},{"system":"Діброва-Одинець","value":"я"},{"system":"Коваленко","value":"я"},{"system":"Поливанова","value":"я"}],"ユ":[{"system":"Rōmaji","value":"yu"},{"system":"Бондаренко","value":"ю"},{"system":"Діброва-Одинець","value":"ю"},{"system":"Коваленко","value":"ю"},{"system":"Поливанова","value":"ю"}],"ヨ":[{"system":"Rōmaji","value":"yo"},{"system":"Бондаренко","value":"йо"},{"system":"Діброва-Одинець","value":"йо"},{"system":"Коваленко","value":"йо"},{"system":"Поливанова","value":"ё"}],"カ":[{"system":"Rōmaji","value":"ka"},{"system":"Бондаренко","value":"ка"},{"system":"Діброва-Одинець","value":"ка"},{"system":"Коваленко","value":"ка"},{"system":"Поливанова","value":"ка"}],"キ":[{"system":"Rōmaji","value":"ki"},{"system":"Бондаренко","value":"кі"},{"system":"Діброва-Одинець","value":"кі"},{"system":"Коваленко","value":"кі"},{"system":"Поливанова","value":"ки"}],"ク":[{"system":"Rōmaji","value":"ku"},{"system":"Бондаренко","value":"ку"},{"system":"Діброва-Одинець","value":"ку"},{"system":"Коваленко","value":"ку"},{"system":"Поливанова","value":"ку"}],"ケ":[{"system":"Rōmaji","value":"ke"},{"system":"Бондаренко","value":"ке"},{"system":"Діброва-Одинець","value":"ке"},{"system":"Коваленко","value":"ке"},{"system":"Поливанова","value":"кэ"}],"コ":[{"system":"Rōmaji","value":"ko"},{"system":"Бондаренко","value":"ко"},{"system":"Діброва-Одинець","value":"ко"},{"system":"Коваленко","value":"ко"},{"system":"Поливанова","value":"ко"}],"サ":[{"system":"Rōmaji","value":"sa"},{"system":"Бондаренко","value":"са"},{"system":"Діброва-Одинець","value":"са"},{"system":"Коваленко","value":"са"},{"system":"Поливанова","value":"са"}],"シ":[{"system":"Rōmaji","value":"shi"},{"system":"Бондаренко","value":"сі"},{"system":"Діброва-Одинець","value":"ші"},{"system":"Коваленко","value":"ші"},{"system":"Поливанова","value":"си"}],"ス":[{"system":"Rōmaji","value":"su"},{"system":"Бондаренко","value":"су"},{"system":"Діброва-Одинець","value":"су"},{"system":"Коваленко","value":"су"},{"system":"Поливанова","value":"су"}],"セ":[{"system":"Rōmaji","value":"se"},{"system":"Бондаренко","value":"се"},{"system":"Діброва-Одинець","value":"се"},{"system":"Коваленко","value":"се"},{"system":"Поливанова","value":"сэ"}],"ソ":[{"system":"Rōmaji","value":"so"},{"system":"Бондаренко","value":"со"},{"system":"Діброва-Одинець","value":"со"},{"system":"Коваленко","value":"со"},{"system":"Поливанова","value":"со"}],"タ":[{"system":"Rōmaji","value":"ta"},{"system":"Бондаренко","value":"та"},{"system":"Діброва-Одинець","value":"та"},{"system":"Коваленко","value":"та"},{"system":"Поливанова","value":"та"}],"チ":[{"system":"Rōmaji","value":"chi"},{"system":"Бондаренко","value":"ті"},{"system":"Діброва-Одинець","value":"чі"},{"system":"Коваленко","value":"чі"},{"system":"Поливанова","value":"ти"}],"ツ":[{"system":"Rōmaji","value":"tsu"},{"system":"Бондаренко","value":"цу"},{"system":"Діброва-Одинець","value":"цу"},{"system":"Коваленко","value":"цу"},{"system":"Поливанова","value":"цу"}],"テ":[{"system":"Rōmaji","value":"te"},{"system":"Бондаренко","value":"те"},{"system":"Діброва-Одинець","value":"те"},{"system":"Коваленко","value":"те"},{"system":"Поливанова","value":"тэ"}],"ト":[{"system":"Rōmaji","value":"to"},{"system":"Бондаренко","value":"то"},{"system":"Діброва-Одинець","value":"то"},{"system":"Коваленко","value":"то"},{"system":"Поливанова","value":"то"}],"ナ":[{"system":"Rōmaji","value":"na"},{"system":"Бондаренко","value":"на"},{"system":"Діброва-Одинець","value":"на"},{"system":"Коваленко","value":"на"},{"system":"Поливанова","value":"на"}],"ニ":[{"system":"Rōmaji","value":"ni"},{"system":"Бондаренко","value":"ні"},{"system":"Діброва-Одинець","value":"ні"},{"system":"Коваленко","value":"ні"},{"system":"Поливанова","value":"ни"}],"ヌ":[{"system":"Rōmaji","value":"nu"},{"system":"Бондаренко","value":"ну"},{"system":"Діброва-Одинець","value":"ну"},{"system":"Коваленко","value":"ну"},{"system":"Поливанова","value":"ну"}],"ネ":[{"system":"Rōmaji","value":"ne"},{"system":"Бондаренко","value":"не"},{"system":"Діброва-Одинець","value":"не"},{"system":"Коваленко","value":"не"},{"system":"Поливанова","value":"нэ"}],"ノ":[{"system":"Rōmaji","value":"no"},{"system":"Бондаренко","value":"но"},{"system":"Діброва-Одинець","value":"но"},{"system":"Коваленко","value":"но"},{"system":"Поливанова","value":"но"}],"ハ":[{"system":"Rōmaji","value":"ha"},{"system":"Бондаренко","value":"ха"},{"system":"Діброва-Одинець","value":"ха"},{"system":"Коваленко","value":"ха"},{"system":"Поливанова","value":"ха"}],"ヒ":[{"system":"Rōmaji","value":"hi"},{"system":"Бондаренко","value":"хі"},{"system":"Діброва-Одинець","value":"хі"},{"system":"Коваленко","value":"хі"},{"system":"Поливанова","value":"хи"}],"フ":[{"system":"Rōmaji","value":"fu"},{"system":"Бондаренко","value":"фу"},{"system":"Діброва-Одинець","value":"фу"},{"system":"Коваленко","value":"фу"},{"system":"Поливанова","value":"фу"}],"ヘ":[{"system":"Rōmaji","value":"he"},{"system":"Бондаренко","value":"хе"},{"system":"Діброва-Одинець","value":"хе"},{"system":"Коваленко","value":"хе"},{"system":"Поливанова","value":"хэ"}],"ホ":[{"system":"Rōmaji","value":"ho"},{"system":"Бондаренко","value":"хо"},{"system":"Діброва-Одинець","value":"хо"},{"system":"Коваленко","value":"хо"},{"system":"Поливанова","value":"хо"}],"マ":[{"system":"Rōmaji","value":"ma"},{"system":"Бондаренко","value":"ма"},{"system":"Діброва-Одинець","value":"ма"},{"system":"Коваленко","value":"ма"},{"system":"Поливанова","value":"ма"}],"ミ":[{"system":"Rōmaji","value":"mi"},{"system":"Бондаренко","value":"мі"},{"system":"Діброва-Одинець","value":"мі"},{"system":"Коваленко","value":"мі"},{"system":"Поливанова","value":"ми"}],"ム":[{"system":"Rōmaji","value":"mu"},{"system":"Бондаренко","value":"му"},{"system":"Діброва-Одинець","value":"му"},{"system":"Коваленко","value":"му"},{"system":"Поливанова","value":"му"}],"メ":[{"system":"Rōmaji","value":"me"},{"system":"Бондаренко","value":"ме"},{"system":"Діброва-Одинець","value":"ме"},{"system":"Коваленко","value":"ме"},{"system":"Поливанова","value":"мэ"}],"モ":[{"system":"Rōmaji","value":"mo"},{"system":"Бондаренко","value":"мо"},{"system":"Діброва-Одинець","value":"мо"},{"system":"Коваленко","value":"мо"},{"system":"Поливанова","value":"мо"}],"ラ":[{"system":"Rōmaji","value":"ra"},{"system":"Бондаренко","value":"ра"},{"system":"Діброва-Одинець","value":"ра"},{"system":"Коваленко","value":"ра"},{"system":"Поливанова","value":"ра"}],"リ":[{"system":"Rōmaji","value":"ri"},{"system":"Бондаренко","value":"рі"},{"system":"Діброва-Одинець","value":"рі"},{"system":"Коваленко","value":"рі"},{"system":"Поливанова","value":"ри"}],"ル":[{"system":"Rōmaji","value":"ru"},{"system":"Бондаренко","value":"ру"},{"system":"Діброва-Одинець","value":"ру"},{"system":"Коваленко","value":"ру"},{"system":"Поливанова","value":"ру"}],"レ":[{"system":"Rōmaji","value":"re"},{"system":"Бондаренко","value":"ре"},{"system":"Діброва-Одинець","value":"ре"},{"system":"Коваленко","value":"ре"},{"system":"Поливанова","value":"рэ"}],"ロ":[{"system":"Rōmaji","value":"ro"},{"system":"Бондаренко","value":"ро"},{"system":"Діброва-Одинець","value":"ро"},{"system":"Коваленко","value":"ро"},{"system":"Поливанова","value":"ро"}],"ワ":[{"system":"Rōmaji","value":"wa"},{"system":"Бондаренко","value":"ва"},{"system":"Діброва-Одинець","value":"ва"},{"system":"Коваленко","value":"ва"},{"system":"Поливанова","value":"ва"}],"ヲ":[{"system":"Rōmaji","value":"wo"},{"system":"Бондаренко","value":"о"},{"system":"Діброва-Одинець","value":"о"},{"system":"Коваленко","value":"о"},{"system":"Поливанова","value":"о"}],"ン":[{"system":"Rōmaji","value":"n"},{"system":"Бондаренко","value":"н"},{"system":"Діброва-Одинець","value":"н"},{"system":"Коваленко","value":"н"},{"system":"Поливанова","value":"н"}],"ガ":[{"system":"Rōmaji","value":"ga"},{"system":"Бондаренко","value":"ґа"},{"system":"Діброва-Одинець","value":"ґа"},{"system":"Коваленко","value":"ґа"},{"system":"Поливанова","value":"га"}],"ギ":[{"system":"Rōmaji","value":"gi"},{"system":"Бондаренко","value":"ґі"},{"system":"Діброва-Одинець","value":"ґі"},{"system":"Коваленко","value":"ґі"},{"system":"Поливанова","value":"ги"}],"グ":[{"system":"Rōmaji","value":"gu"},{"system":"Бондаренко","value":"ґу"},{"system":"Діброва-Одинець","value":"ґу"},{"system":"Коваленко","value":"ґу"},{"system":"Поливанова","value":"гу"}],"ゲ":[{"system":"Rōmaji","value":"ge"},{"system":"Бондаренко","value":"ґе"},{"system":"Діброва-Одинець","value":"ґе"},{"system":"Коваленко","value":"ґе"},{"system":"Поливанова","value":"гэ"}],"ゴ":[{"system":"Rōmaji","value":"go"},{"system":"Бондаренко","value":"ґо"},{"system":"Діброва-Одинець","value":"ґо"},{"system":"Коваленко","value":"ґо"},{"system":"Поливанова","value":"го"}],"ザ":[{"system":"Rōmaji","value":"za"},{"system":"Бондаренко","value":"дза"},{"system":"Діброва-Одинець","value":"дза"},{"system":"Коваленко","value":"дза"},{"system":"Поливанова","value":"дза"}],"ジ":[{"system":"Rōmaji","value":"ji"},{"system":"Бондаренко","value":"дзі"},{"system":"Діброва-Одинець","value":"дзі"},{"system":"Коваленко","value":"джі"},{"system":"Поливанова","value":"дзи"}],"ズ":[{"system":"Rōmaji","value":"zu"},{"system":"Бондаренко","value":"дзу"},{"system":"Діброва-Одинець","value":"дзу"},{"system":"Коваленко","value":"дзу"},{"system":"Поливанова","value":"дзу"}],"ゼ":[{"system":"Rōmaji","value":"ze"},{"system":"Бондаренко","value":"дзе"},{"system":"Діброва-Одинець","value":"дзе"},{"system":"Коваленко","value":"дзе"},{"system":"Поливанова","value":"дзэ"}],"ゾ":[{"system":"Rōmaji","value":"zo"},{"system":"Бондаренко","value":"дзо"},{"system":"Діброва-Одинець","value":"дзо"},{"system":"Коваленко","value":"дзо"},{"system":"Поливанова","value":"дзо"}],"ダ":[{"system":"Rōmaji","value":"da"},{"system":"Бондаренко","value":"да"},{"system":"Діброва-Одинець","value":"да"},{"system":"Коваленко","value":"да"},{"system":"Поливанова","value":"да"}],"ヂ":[{"system":"Rōmaji","value":"ji"},{"system":"Бондаренко","value":"дзі"},{"system":"Діброва-Одинець","value":"дзі"},{"system":"Коваленко","value":"джі"},{"system":"Поливанова","value":"дзи"}],"ヅ":[{"system":"Rōmaji","value":"zu"},{"system":"Бондаренко","value":"дзу"},{"system":"Діброва-Одинець","value":"дзу"},{"system":"Коваленко","value":"дзу"},{"system":"Поливанова","value":"дзу"}],"デ":[{"system":"Rōmaji","value":"de"},{"system":"Бондаренко","value":"де"},{"system":"Діброва-Одинець","value":"де"},{"system":"Коваленко","value":"де"},{"system":"Поливанова","value":"дэ"}],"ド":[{"system":"Rōmaji","value":"do"},{"system":"Бондаренко","value":"до"},{"system":"Діброва-Одинець","value":"до"},{"system":"Коваленко","value":"до"},{"system":"Поливанова","value":"до"}],"バ":[{"system":"Rōmaji","value":"ba"},{"system":"Бондаренко","value":"ба"},{"system":"Діброва-Одинець","value":"ба"},{"system":"Коваленко","value":"ба"},{"system":"Поливанова","value":"ба"}],"ビ":[{"system":"Rōmaji","value":"bi"},{"system":"Бондаренко","value":"бі"},{"system":"Діброва-Одинець","value":"бі"},{"system":"Коваленко","value":"бі"},{"system":"Поливанова","value":"би"}],"ブ":[{"system":"Rōmaji","value":"bu"},{"system":"Бондаренко","value":"бу"},{"system":"Діброва-Одинець","value":"бу"},{"system":"Коваленко","value":"бу"},{"system":"Поливанова","value":"бу"}],"ベ":[{"system":"Rōmaji","value":"be"},{"system":"Бондаренко","value":"бе"},{"system":"Діброва-Одинець","value":"бе"},{"system":"Коваленко","value":"бе"},{"system":"Поливанова","value":"бэ"}],"ボ":[{"system":"Rōmaji","value":"bo"},{"system":"Бондаренко","value":"бо"},{"system":"Діброва-Одинець","value":"бо"},{"system":"Коваленко","value":"бо"},{"system":"Поливанова","value":"бо"}],"パ":[{"system":"Rōmaji","value":"pa"},{"system":"Бондаренко","value":"па"},{"system":"Діброва-Одинець","value":"па"},{"system":"Коваленко","value":"па"},{"system":"Поливанова","value":"па"}],"ピ":[{"system":"Rōmaji","value":"pi"},{"system":"Бондаренко","value":"пі"},{"system":"Діброва-Одинець","value":"пі"},{"system":"Коваленко","value":"пі"},{"system":"Поливанова","value":"пи"}],"プ":[{"system":"Rōmaji","value":"pu"},{"system":"Бондаренко","value":"пу"},{"system":"Діброва-Одинець","value":"пу"},{"system":"Коваленко","value":"пу"},{"system":"Поливанова","value":"пу"}],"ペ":[{"system":"Rōmaji","value":"pe"},{"system":"Бондаренко","value":"пе"},{"system":"Діброва-Одинець","value":"пе"},{"system":"Коваленко","value":"пе"},{"system":"Поливанова","value":"пэ"}],"ポ":[{"system":"Rōmaji","value":"po"},{"system":"Бондаренко","value":"по"},{"system":"Діброва-Одинець","value":"по"},{"system":"Коваленко","value":"по"},{"system":"Поливанова","value":"по"}]} -------------------------------------------------------------------------------- /lib/party.dart: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2020 Naval Alcalá 3 | 4 | This file is part of Nihonoari. 5 | 6 | Nihonoari is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Nihonoari is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Nihonoari. If not, see . 18 | */ 19 | 20 | import 'dart:async'; 21 | import 'dart:io'; 22 | 23 | import 'package:nihonoari/preferences.dart'; 24 | import 'package:flutter/material.dart'; 25 | import 'localizations.dart'; 26 | import 'quiz_engine.dart'; 27 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 28 | import 'table.dart'; 29 | 30 | class Party extends StatefulWidget { 31 | final bool h, k, re; 32 | 33 | final Map hv, kv; 34 | 35 | Party( 36 | {required this.h, 37 | required this.hv, 38 | required this.k, 39 | required this.kv, 40 | required this.re}); 41 | 42 | @override 43 | _Party createState() => _Party(h, hv, k, kv, re); 44 | } 45 | 46 | class _Party extends State { 47 | Color? _questionColor; 48 | 49 | FocusNode _focusNode = FocusNode(); 50 | bool _ignore = false; 51 | Timer? t; 52 | 53 | TextEditingController _controller = TextEditingController(); 54 | 55 | List scoreKeeper = []; 56 | int total = 0; 57 | int accepted = 0; 58 | int rejected = 0; 59 | double ratio = 0; 60 | 61 | _Party(h, hv, k, kv, re) { 62 | AppPreferences.setHiraganaSet(hv); 63 | AppPreferences.setKatakanaSet(kv); 64 | 65 | //var loc = WidgetsBinding.instance.window.locales; 66 | var currentDefaultSystemLocale = Platform.localeName; 67 | QuizBrain.setList(h, hv, k, kv, re, currentDefaultSystemLocale); 68 | } 69 | 70 | final GlobalKey _scaffoldKey = new GlobalKey(); 71 | 72 | void showInSnackBar(int control, String result) { 73 | ScaffoldMessenger.of(context).showSnackBar(SnackBar( 74 | backgroundColor: Theme.of(context).colorScheme.primary, 75 | elevation: 10, 76 | duration: Duration(milliseconds: control), 77 | content: Text( 78 | '${AppLocalizations.of(context)!.translate('quiz_correct')}: $result', 79 | style: TextStyle( 80 | fontSize: 20, 81 | color: Theme.of(context).colorScheme.onPrimary, 82 | fontWeight: FontWeight.bold), 83 | textAlign: TextAlign.center, 84 | ), 85 | )); 86 | } 87 | 88 | void hideSnackbar() { 89 | ScaffoldMessenger.of(context).hideCurrentSnackBar(); 90 | } 91 | 92 | @override 93 | void dispose() { 94 | _focusNode.dispose(); 95 | if (t != null && t!.isActive) t!.cancel(); 96 | QuizBrain.clearList(); 97 | super.dispose(); 98 | } 99 | 100 | @override 101 | void initState() { 102 | super.initState(); 103 | } 104 | 105 | void _showDialog() async { 106 | hideSnackbar(); 107 | // flutter defined function 108 | showDialog( 109 | context: context, 110 | builder: (BuildContext context) { 111 | // return object of type Dialog 112 | return AlertDialog( 113 | title: 114 | new Text(AppLocalizations.of(context)!.translate('quiz_stats')!, 115 | style: TextStyle( 116 | color: Theme.of(context).colorScheme.secondary, 117 | )), 118 | content: new Text( 119 | "${AppLocalizations.of(context)!.translate('quiz_total')}: $total\n" 120 | "${AppLocalizations.of(context)!.translate('quiz_passed')}: $accepted\n" 121 | "${AppLocalizations.of(context)!.translate('quiz_failed')}: $rejected\n" 122 | "${AppLocalizations.of(context)!.translate('quiz_rate')}: ${ratio.toStringAsFixed(2)}%", 123 | style: TextStyle( 124 | color: Theme.of(context).colorScheme.secondary, 125 | )), 126 | actions: [ 127 | // usually buttons at the bottom of the dialog 128 | new TextButton( 129 | child: new Icon( 130 | Icons.done, 131 | color: Theme.of(context).colorScheme.primary, 132 | ), 133 | onPressed: () { 134 | Navigator.of(context).pop(); 135 | }, 136 | ), 137 | ], 138 | ); 139 | }, 140 | ); 141 | } 142 | 143 | Future _onBackPressed() { 144 | FocusScope.of(context).requestFocus(new FocusNode()); 145 | return showDialog( 146 | context: context, 147 | builder: (context) => new AlertDialog( 148 | title: 149 | new Text(AppLocalizations.of(context)!.translate('quiz_stoptit')!, 150 | style: TextStyle( 151 | color: Theme.of(context).colorScheme.secondary, 152 | )), 153 | content: 154 | new Text(AppLocalizations.of(context)!.translate('quiz_stopmes')!, 155 | style: TextStyle( 156 | color: Theme.of(context).colorScheme.secondary, 157 | )), 158 | actions: [ 159 | // usually buttons at the bottom of the dialog 160 | new TextButton( 161 | child: new Icon( 162 | Icons.close, 163 | color: Theme.of(context).colorScheme.primary, 164 | ), 165 | onPressed: () { 166 | Navigator.of(context).pop(false); 167 | }, 168 | ), 169 | new TextButton( 170 | child: new Icon( 171 | Icons.done, 172 | color: Theme.of(context).colorScheme.primary, 173 | ), 174 | onPressed: () { 175 | Navigator.of(context).pop(true); 176 | }, 177 | ), 178 | ], 179 | ), 180 | ).then((value) { 181 | return value ?? false; 182 | }); 183 | } 184 | 185 | @override 186 | Widget build(BuildContext context) { 187 | if (_questionColor == null) { 188 | _questionColor = Theme.of(context).colorScheme.secondary; 189 | } 190 | 191 | return PopScope( 192 | canPop: false, 193 | onPopInvoked: (didPop) async { 194 | if (didPop) { 195 | return; 196 | } 197 | bool isExit = await _onBackPressed(); 198 | if (isExit) { 199 | Navigator.of(context).pop(); 200 | } 201 | }, 202 | child: new Scaffold( 203 | key: _scaffoldKey, 204 | body: SafeArea( 205 | child: Padding( 206 | padding: EdgeInsets.symmetric(horizontal: 10.0), 207 | child: Column( 208 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 209 | crossAxisAlignment: CrossAxisAlignment.stretch, 210 | children: [ 211 | Expanded( 212 | flex: 0, 213 | child: Row( 214 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 215 | children: [ 216 | IconButton( 217 | // Use the FontAwesomeIcons class for the IconData 218 | icon: new Icon(FontAwesomeIcons.language, 219 | color: Theme.of(context).colorScheme.secondary), 220 | onPressed: () { 221 | FocusScope.of(context) 222 | .requestFocus(new FocusNode()); 223 | Navigator.push( 224 | context, 225 | MaterialPageRoute( 226 | builder: (context) => BasicGridView()), 227 | ); 228 | }), 229 | IconButton( 230 | // Use the FontAwesomeIcons class for the IconData 231 | icon: new Icon(FontAwesomeIcons.chartBar, 232 | color: Theme.of(context).colorScheme.secondary), 233 | onPressed: () { 234 | FocusScope.of(context) 235 | .requestFocus(new FocusNode()); 236 | _showDialog(); 237 | }), 238 | ], 239 | )), 240 | Expanded( 241 | flex: 4, 242 | child: Padding( 243 | padding: EdgeInsets.all(10.0), 244 | child: Center( 245 | child: FittedBox( 246 | fit: BoxFit.fitWidth, 247 | child: Text( 248 | QuizBrain.currentQuestion.question, 249 | textAlign: TextAlign.center, 250 | style: TextStyle( 251 | fontFamily: 'MP1P_LIGHT', 252 | fontSize: 125.0, 253 | color: _questionColor, 254 | ), 255 | ), 256 | ), 257 | ), 258 | ), 259 | ), 260 | Expanded( 261 | child: TextField( 262 | textInputAction: TextInputAction.done, 263 | controller: _controller, 264 | focusNode: _focusNode, 265 | autofocus: true, 266 | textAlign: TextAlign.center, 267 | cursorColor: Theme.of(context).colorScheme.secondary, 268 | decoration: InputDecoration( 269 | hoverColor: Theme.of(context).colorScheme.secondary, 270 | fillColor: Theme.of(context).colorScheme.secondary, 271 | focusColor: Theme.of(context).colorScheme.secondary, 272 | border: InputBorder.none, 273 | hintStyle: TextStyle(color: Colors.grey), 274 | hintText: (() { 275 | if (QuizBrain.re) { 276 | if (QuizBrain.currentQuestion.type == "hiragana") { 277 | return AppLocalizations.of(context)! 278 | .translate('quiz_enter_hira'); 279 | } else { 280 | return AppLocalizations.of(context)! 281 | .translate('quiz_enter_kata'); 282 | } 283 | } else { 284 | return AppLocalizations.of(context)! 285 | .translate('quiz_enter'); 286 | } 287 | })()), 288 | style: TextStyle( 289 | fontSize: 20, 290 | color: Theme.of(context).colorScheme.secondary, 291 | ), 292 | onSubmitted: (value) { 293 | FocusScope.of(context).autofocus(_focusNode); 294 | if (_ignore || value.length < 1) { 295 | return; 296 | } 297 | _ignore = true; 298 | 299 | int control = 0; 300 | bool passed = false; 301 | 302 | _controller.clear(); 303 | 304 | List answer = QuizBrain.currentQuestion.answer; 305 | 306 | ++total; 307 | 308 | setState(() { 309 | // check if an extra answer is available, and if so, if it matches. 310 | // this is part of the fix for #33 311 | if (answer.contains(value.toLowerCase())) { 312 | control = 500; 313 | print("OK"); 314 | _questionColor = Colors.greenAccent; 315 | ++accepted; 316 | passed = true; 317 | } else { 318 | control = 2000; 319 | print("NO"); 320 | _questionColor = Theme.of(context).colorScheme.primary; 321 | ++rejected; 322 | showInSnackBar( 323 | control, answer.toSet().toList().join(" / ")); 324 | } 325 | }); 326 | 327 | ratio = (accepted / total) * 100; 328 | 329 | t = Timer(Duration(milliseconds: control), () { 330 | setState(() { 331 | _questionColor = 332 | Theme.of(context).colorScheme.secondary; 333 | QuizBrain.nextQuestion(passed); 334 | _ignore = false; 335 | }); 336 | }); 337 | 338 | // and later, before the timer goes off... 339 | }, 340 | )), 341 | Expanded( 342 | child: Row( 343 | children: scoreKeeper, 344 | ), 345 | ), 346 | ], 347 | ), 348 | ), 349 | ), 350 | ), 351 | ); 352 | } 353 | } 354 | -------------------------------------------------------------------------------- /android/app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | 12 | 13 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2020 Naval Alcalá 3 | 4 | This file is part of Nihonoari. 5 | 6 | Nihonoari is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | Nihonoari is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with Nihonoari. If not, see . 18 | */ 19 | 20 | import 'dart:convert'; 21 | 22 | import 'package:nihonoari/Models/Transliteration.dart'; 23 | 24 | import 'UI.Utils/IconCreator.dart'; 25 | import 'Models/GlobalKanas.dart'; 26 | import 'preferences.dart'; 27 | import 'package:flutter/material.dart'; 28 | import 'package:flutter_localizations/flutter_localizations.dart'; 29 | import 'party.dart'; 30 | import 'package:flutter/gestures.dart'; 31 | 32 | import 'localizations.dart'; 33 | 34 | import 'dart:async' show Future; 35 | import 'package:flutter/services.dart' show rootBundle; 36 | 37 | Future loadAsset(String asset) async { 38 | return await rootBundle.loadString(asset); 39 | } 40 | 41 | Map _hirasol = new Map(); 42 | Map _katasol = new Map(); 43 | 44 | Future main() async { 45 | WidgetsFlutterBinding.ensureInitialized(); 46 | String hiraRawData = await loadAsset("assets/data/hira.json"); 47 | String kanaRawData = await loadAsset("assets/data/kata.json"); 48 | GlobalKanas.hiraganaMap = kanasFromJson(hiraRawData); 49 | GlobalKanas.katakanaMap = kanasFromJson(kanaRawData); 50 | 51 | runApp(new MaterialApp( 52 | supportedLocales: [ 53 | Locale('en', 'US'), 54 | Locale('es', ''), 55 | Locale('fr', ''), 56 | Locale('uk', ''), 57 | Locale('ru', ''), 58 | Locale('be', ''), 59 | Locale('tr', ''), 60 | Locale('de', '') 61 | ], 62 | localizationsDelegates: [ 63 | AppLocalizations.delegate, 64 | GlobalMaterialLocalizations.delegate, 65 | GlobalWidgetsLocalizations.delegate, 66 | GlobalCupertinoLocalizations.delegate, 67 | DefaultWidgetsLocalizations.delegate, 68 | ], 69 | darkTheme: ThemeData( 70 | useMaterial3: true, 71 | // Define the default brightness and colors. 72 | colorScheme: ColorScheme( 73 | primary: Colors.red, 74 | secondary: Colors.white, 75 | error: Colors.red, 76 | onBackground: Colors.white, 77 | onError: Colors.red, 78 | onPrimary: Colors.white, 79 | onSecondary: Colors.black, 80 | onSurface: Colors.white, 81 | surface: Colors.black, 82 | tertiary: Colors.grey, 83 | background: Colors.black, 84 | brightness: Brightness.dark, 85 | ), 86 | dialogTheme: const DialogTheme( 87 | backgroundColor: Colors.black, 88 | surfaceTintColor: Colors.grey, 89 | ), 90 | 91 | unselectedWidgetColor: Colors.white, 92 | textTheme: TextTheme( 93 | displayLarge: const TextStyle( 94 | fontSize: 72, 95 | fontWeight: FontWeight.bold, 96 | ), 97 | ), 98 | ), 99 | theme: ThemeData( 100 | useMaterial3: true, 101 | colorScheme: ColorScheme( 102 | primary: Colors.redAccent, 103 | secondary: Color(0xff011627), 104 | error: Colors.redAccent, 105 | onBackground: Color(0xff011627), 106 | onError: Colors.redAccent, 107 | onPrimary: Color(0xfffffbff), 108 | onSecondary: Color(0xfffffbff), 109 | onSurface: Color(0xff011627), 110 | surface: Color(0xfffffbff), 111 | tertiary: Colors.grey, 112 | background: Color(0xfffffbff), 113 | brightness: Brightness.light, 114 | ), 115 | dialogTheme: const DialogTheme( 116 | backgroundColor: Color(0xfffffbff), 117 | surfaceTintColor: Colors.transparent, 118 | ), 119 | /* dark theme settings */ 120 | ), 121 | themeMode: ThemeMode.system, 122 | home: new MyApp(), 123 | )); 124 | } 125 | 126 | class MyApp extends StatefulWidget { 127 | @override 128 | _State createState() => new _State(); 129 | } 130 | 131 | class HiraDialog extends StatefulWidget { 132 | @override 133 | _HiraDialogState createState() => _HiraDialogState(); 134 | } 135 | 136 | class KataDialog extends StatefulWidget { 137 | @override 138 | _KataDialogState createState() => _KataDialogState(); 139 | } 140 | 141 | class _HiraDialogState extends State { 142 | @override 143 | Widget build(BuildContext context) { 144 | return AlertDialog( 145 | title: Text( 146 | AppLocalizations.of(context)!.translate('main_hset')!, 147 | style: TextStyle( 148 | color: Theme.of(context).colorScheme.secondary, 149 | ), 150 | ), 151 | content: Container( 152 | width: double.maxFinite, 153 | child: new ListView( 154 | children: _hirasol.keys.map((String key) { 155 | return new CheckboxListTile( 156 | title: new Text( 157 | key, 158 | style: TextStyle( 159 | color: Theme.of(context).colorScheme.secondary, 160 | ), 161 | ), 162 | checkColor: Theme.of(context).colorScheme.onPrimary, 163 | activeColor: Theme.of(context).colorScheme.primary, 164 | value: _hirasol[key], 165 | onChanged: (bool? value) { 166 | setState(() { 167 | _hirasol[key] = value; 168 | }); 169 | }, 170 | ); 171 | }).toList(), 172 | ), 173 | ), 174 | actions: [ 175 | // usually buttons at the bottom of the dialog 176 | new TextButton( 177 | child: new Icon( 178 | Icons.done, 179 | color: Theme.of(context).colorScheme.primary, 180 | ), 181 | onPressed: () { 182 | Navigator.of(context).pop(); 183 | }, 184 | ), 185 | ], 186 | ); 187 | } 188 | } 189 | 190 | class _KataDialogState extends State { 191 | @override 192 | Widget build(BuildContext context) { 193 | return AlertDialog( 194 | title: Text( 195 | AppLocalizations.of(context)!.translate('main_kset')!, 196 | style: TextStyle( 197 | color: Theme.of(context).colorScheme.secondary, 198 | ), 199 | ), 200 | content: Container( 201 | width: double.maxFinite, 202 | child: new ListView( 203 | children: _katasol.keys.map((String key) { 204 | return new CheckboxListTile( 205 | title: new Text( 206 | key, 207 | style: TextStyle( 208 | color: Theme.of(context).colorScheme.secondary, 209 | ), 210 | ), 211 | checkColor: Theme.of(context).colorScheme.onPrimary, 212 | activeColor: Theme.of(context).colorScheme.primary, 213 | value: _katasol[key], 214 | onChanged: (bool? value) { 215 | setState(() { 216 | _katasol[key] = value; 217 | }); 218 | }, 219 | ); 220 | }).toList(), 221 | ), 222 | ), 223 | actions: [ 224 | // usually buttons at the bottom of the dialog 225 | new TextButton( 226 | child: new Icon( 227 | Icons.done, 228 | color: Theme.of(context).colorScheme.primary, 229 | ), 230 | onPressed: () { 231 | Navigator.of(context).pop(); 232 | }, 233 | ), 234 | ], 235 | ); 236 | } 237 | } 238 | 239 | //State is information of the application that can change over time or when some actions are taken. 240 | class _State extends State { 241 | bool _katakana = false; 242 | bool _hiragana = false; 243 | bool _reverse = false; 244 | 245 | @override 246 | void initState() { 247 | super.initState(); 248 | readData(); 249 | } 250 | 251 | Future readData() async { 252 | await AppPreferences.init(); 253 | _hirasol = json.decode(AppPreferences.getHiraganaSet()); 254 | _katasol = json.decode(AppPreferences.getKatakanaSet()); 255 | } 256 | 257 | bool _isButtonDisabled = true; 258 | 259 | //we omitted the brackets '{}' and are using fat arrow '=>' instead, this is dart syntax 260 | void _katakanaChanged(bool value) => setState(() => _katakana = value); 261 | 262 | void _hiraganaChanged(bool value) => setState(() => _hiragana = value); 263 | 264 | void __isButtonDisabledChanged() { 265 | _isButtonDisabled = _katakana || _hiragana ? false : true; 266 | } 267 | 268 | @override 269 | Widget build(BuildContext context) { 270 | return new Scaffold( 271 | //hit Ctrl+space in intellij to know what are the options you can use in flutter widgets 272 | body: new Container( 273 | padding: new EdgeInsets.all(32.0), 274 | child: new Center( 275 | child: new Column( 276 | children: [ 277 | Expanded( 278 | flex: 1, 279 | child: Column( 280 | mainAxisAlignment: MainAxisAlignment.center, 281 | crossAxisAlignment: CrossAxisAlignment.center, 282 | children: [ 283 | Padding( 284 | padding: EdgeInsets.all(25.0), 285 | child: RichText( 286 | text: TextSpan( 287 | text: 'nihonoari ', 288 | style: TextStyle( 289 | fontFamily: 'MP1P_LIGHT', 290 | fontSize: 25.0, 291 | color: Theme.of(context).colorScheme.secondary, 292 | ), 293 | children: [ 294 | TextSpan( 295 | text: 'project', 296 | style: TextStyle(fontFamily: 'MP1P_REGULAR')), 297 | ], 298 | ), 299 | ), 300 | ), 301 | Padding( 302 | padding: EdgeInsets.all(5), 303 | child: RichText( 304 | text: TextSpan( 305 | text: AppLocalizations.of(context)! 306 | .translate('main_licenses'), 307 | recognizer: TapGestureRecognizer() 308 | ..onTap = () { 309 | showLicensePage( 310 | context: context, 311 | applicationName: 'Nihonoari', 312 | applicationLegalese: 313 | 'Copyright (C) 2020 Naval Alcalá', 314 | ); 315 | }, 316 | style: TextStyle( 317 | fontSize: 15.0, 318 | color: Theme.of(context).colorScheme.tertiary, 319 | ), 320 | ), 321 | ), 322 | ), 323 | ], 324 | )), 325 | Expanded( 326 | flex: 1, 327 | child: new Column(children: [ 328 | new CheckboxListTile( 329 | checkColor: Theme.of(context).colorScheme.onPrimary, 330 | activeColor: Theme.of(context).colorScheme.primary, 331 | value: _hiragana, 332 | onChanged: (value) async { 333 | if (value!) { 334 | await showDialog( 335 | context: context, 336 | builder: (context) { 337 | return HiraDialog(); 338 | }, 339 | ); 340 | } 341 | if (!_hirasol.containsValue(true)) { 342 | _hiraganaChanged(false); 343 | } else { 344 | _hiraganaChanged(value); 345 | } 346 | __isButtonDisabledChanged(); 347 | }, 348 | title: new Text( 349 | 'Hiragana', 350 | style: TextStyle( 351 | color: Theme.of(context).colorScheme.secondary, 352 | ), 353 | ), 354 | controlAffinity: ListTileControlAffinity.leading, 355 | subtitle: new Text( 356 | AppLocalizations.of(context)!.translate('main_hiragana')!, 357 | style: TextStyle( 358 | color: Theme.of(context).colorScheme.secondary, 359 | ), 360 | ), 361 | secondary: new IconCreator("あ"), 362 | ), 363 | new CheckboxListTile( 364 | value: _katakana, 365 | checkColor: Theme.of(context).colorScheme.onPrimary, 366 | activeColor: Theme.of(context).colorScheme.primary, 367 | onChanged: (value) async { 368 | if (value!) { 369 | await showDialog( 370 | context: context, 371 | builder: (context) { 372 | return KataDialog(); 373 | }, 374 | ); 375 | } 376 | 377 | if (!_katasol.containsValue(true)) { 378 | _katakanaChanged(false); 379 | } else { 380 | _katakanaChanged(value); 381 | } 382 | __isButtonDisabledChanged(); 383 | }, 384 | title: new Text( 385 | 'Katakana', 386 | style: TextStyle( 387 | color: Theme.of(context).colorScheme.secondary, 388 | ), 389 | ), 390 | controlAffinity: ListTileControlAffinity.leading, 391 | subtitle: new Text( 392 | AppLocalizations.of(context)!.translate('main_katakana')!, 393 | style: TextStyle( 394 | color: Theme.of(context).colorScheme.secondary, 395 | ), 396 | ), 397 | secondary: new IconCreator("ア"), 398 | ), 399 | SwitchListTile( 400 | title: new Text( 401 | AppLocalizations.of(context)!.translate('main_rset')!, 402 | style: TextStyle( 403 | color: Theme.of(context).colorScheme.secondary, 404 | ), 405 | ), 406 | subtitle: new Text( 407 | AppLocalizations.of(context)!.translate('main_reverse')!, 408 | style: TextStyle( 409 | color: Theme.of(context).colorScheme.secondary, 410 | ), 411 | ), 412 | controlAffinity: ListTileControlAffinity.leading, 413 | value: _reverse, 414 | activeColor: Theme.of(context).colorScheme.onPrimary, 415 | activeTrackColor: Theme.of(context).colorScheme.primary, 416 | inactiveThumbColor: Theme.of(context).colorScheme.secondary, 417 | inactiveTrackColor: 418 | Theme.of(context).colorScheme.background, 419 | onChanged: (bool value) { 420 | setState(() { 421 | _reverse = value; 422 | }); 423 | }, 424 | secondary: new IconCreator("A"), 425 | ) 426 | ]), 427 | ), 428 | Expanded( 429 | flex: 0, 430 | child: Center( 431 | child: new ElevatedButton( 432 | style: ElevatedButton.styleFrom( 433 | minimumSize: Size(100, 50), 434 | padding: const EdgeInsets.all(8.0), 435 | backgroundColor: Theme.of(context).colorScheme.primary, 436 | foregroundColor: Theme.of(context).colorScheme.secondary, 437 | ), 438 | onPressed: _isButtonDisabled 439 | ? null 440 | : () { 441 | Navigator.push( 442 | context, 443 | MaterialPageRoute( 444 | builder: (BuildContext context) => new Party( 445 | h: _hiragana, 446 | hv: _hirasol, 447 | k: _katakana, 448 | kv: _katasol, 449 | re: _reverse)), 450 | ); 451 | }, 452 | child: new Text( 453 | _isButtonDisabled 454 | ? AppLocalizations.of(context)! 455 | .translate('main_select')! 456 | : AppLocalizations.of(context)! 457 | .translate('main_start')!, 458 | style: TextStyle( 459 | color: Theme.of(context).colorScheme.onPrimary), 460 | ), 461 | ), 462 | ), 463 | ), 464 | ], 465 | ), 466 | ), 467 | ), 468 | ); 469 | } 470 | } 471 | --------------------------------------------------------------------------------