diff --git a/.gitignore b/.gitignore
index 13c88ec..ae5458c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,5 @@ doc/api/
android/key.properties
android/local.properties
*.log
+.flutter-plugins
+.flutter-plugins-dependencies
diff --git a/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
index d007606..e2a3095 100644
--- a/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
+++ b/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
@@ -1,6 +1,7 @@
package io.flutter.plugins;
import io.flutter.plugin.common.PluginRegistry;
+import io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin;
/**
* Generated file. Do not edit.
@@ -10,6 +11,7 @@ public static void registerWith(PluginRegistry registry) {
if (alreadyRegisteredWith(registry)) {
return;
}
+ SharedPreferencesPlugin.registerWith(registry.registrarFor("io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin"));
}
private static boolean alreadyRegisteredWith(PluginRegistry registry) {
diff --git a/assets/LICENSES.txt b/assets/LICENSES.txt
index 8d41afa..5fe38b2 100644
--- a/assets/LICENSES.txt
+++ b/assets/LICENSES.txt
@@ -1,3 +1,20 @@
+Nihonoari
+Copyright (C) 2020 Naval Alcalá
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
+
+
THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY BE CONTAINED IN THIS APPLICATION.
@@ -6,8 +23,6 @@ THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY B
-The following software may be included in this application:
-
kana (https://github.com/paulorobertocruz/kana)
@@ -40,9 +55,7 @@ SOFTWARE.
=====
-
-The following software may be included in this application:
font_awesome_flutter (https://github.com/brianegan/font_awesome_flutter)
@@ -55,4 +68,38 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+=====
+
+
+
+
+shared_preferences (https://pub.dev/packages/shared_preferences)
+
+Copyright 2017 The Chromium Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/fastlane/metadata/android/en-US/changelogs/7.txt b/fastlane/metadata/android/en-US/changelogs/7.txt
new file mode 100644
index 0000000..e0f91a4
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/7.txt
@@ -0,0 +1,2 @@
+* The selected Kana sets are remembered
+* Added UI translation
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png
index 49aa478..5512fa9 100644
Binary files a/fastlane/metadata/android/en-US/images/icon.png and b/fastlane/metadata/android/en-US/images/icon.png differ
diff --git a/fastlane/metadata/android/es/changelogs/7.txt b/fastlane/metadata/android/es/changelogs/7.txt
new file mode 100644
index 0000000..d7f6eba
--- /dev/null
+++ b/fastlane/metadata/android/es/changelogs/7.txt
@@ -0,0 +1,2 @@
+* Se recuerda el conjunto de Kanas seleccionados
+* Se incorpora traducción a la interfaz
\ No newline at end of file
diff --git a/fastlane/metadata/android/es/images/icon.png b/fastlane/metadata/android/es/images/icon.png
index 49aa478..5512fa9 100644
Binary files a/fastlane/metadata/android/es/images/icon.png and b/fastlane/metadata/android/es/images/icon.png differ
diff --git a/fastlane/metadata/android/fr/changelogs/4.txt b/fastlane/metadata/android/fr/changelogs/4.txt
new file mode 100644
index 0000000..f2e7c42
--- /dev/null
+++ b/fastlane/metadata/android/fr/changelogs/4.txt
@@ -0,0 +1 @@
+Correction des erreurs
diff --git a/fastlane/metadata/android/fr/changelogs/5.txt b/fastlane/metadata/android/fr/changelogs/5.txt
new file mode 100644
index 0000000..6de71dd
--- /dev/null
+++ b/fastlane/metadata/android/fr/changelogs/5.txt
@@ -0,0 +1,4 @@
+* Ajouter par groupe Hiragana et Katakana
+* Algorithme de question amélioré
+* Réparé le Katakana "ri"
+* Thème sombre amélioré
diff --git a/fastlane/metadata/android/fr/changelogs/6.txt b/fastlane/metadata/android/fr/changelogs/6.txt
new file mode 100644
index 0000000..5841ce4
--- /dev/null
+++ b/fastlane/metadata/android/fr/changelogs/6.txt
@@ -0,0 +1,2 @@
+* Algorithme de répétition espacée
+* Le clavier ne se cache pas quand l'utilisateur accepte
diff --git a/fastlane/metadata/android/fr/changelogs/7.txt b/fastlane/metadata/android/fr/changelogs/7.txt
new file mode 100644
index 0000000..20c36c7
--- /dev/null
+++ b/fastlane/metadata/android/fr/changelogs/7.txt
@@ -0,0 +1,2 @@
+* Les ensembles Kana sélectionnés sont mémorisés
+* Traduction de l'UI ajoutée
\ No newline at end of file
diff --git a/fastlane/metadata/android/fr/full_description.txt b/fastlane/metadata/android/fr/full_description.txt
new file mode 100644
index 0000000..8b3d148
--- /dev/null
+++ b/fastlane/metadata/android/fr/full_description.txt
@@ -0,0 +1,4 @@
+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.
+
+Veux tu collaborer avec le projet ou reporter un erreur?
+https://github.com/aeri/Nihonoari-App
diff --git a/fastlane/metadata/android/fr/images/icon.png b/fastlane/metadata/android/fr/images/icon.png
new file mode 100644
index 0000000..5512fa9
Binary files /dev/null and b/fastlane/metadata/android/fr/images/icon.png differ
diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/1.png b/fastlane/metadata/android/fr/images/phoneScreenshots/1.png
new file mode 100644
index 0000000..adb4923
Binary files /dev/null and b/fastlane/metadata/android/fr/images/phoneScreenshots/1.png differ
diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/2.png b/fastlane/metadata/android/fr/images/phoneScreenshots/2.png
new file mode 100644
index 0000000..7de0cd0
Binary files /dev/null and b/fastlane/metadata/android/fr/images/phoneScreenshots/2.png differ
diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/3.png b/fastlane/metadata/android/fr/images/phoneScreenshots/3.png
new file mode 100644
index 0000000..1ed14be
Binary files /dev/null and b/fastlane/metadata/android/fr/images/phoneScreenshots/3.png differ
diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/4.png b/fastlane/metadata/android/fr/images/phoneScreenshots/4.png
new file mode 100644
index 0000000..37e38fc
Binary files /dev/null and b/fastlane/metadata/android/fr/images/phoneScreenshots/4.png differ
diff --git a/fastlane/metadata/android/fr/images/phoneScreenshots/5.png b/fastlane/metadata/android/fr/images/phoneScreenshots/5.png
new file mode 100644
index 0000000..3edbc1f
Binary files /dev/null and b/fastlane/metadata/android/fr/images/phoneScreenshots/5.png differ
diff --git a/fastlane/metadata/android/fr/short_description.txt b/fastlane/metadata/android/fr/short_description.txt
new file mode 100644
index 0000000..27920eb
--- /dev/null
+++ b/fastlane/metadata/android/fr/short_description.txt
@@ -0,0 +1 @@
+Une app petite et minimaliste pour pratiquer les Kana japonais
diff --git a/fastlane/metadata/android/fr/title.txt b/fastlane/metadata/android/fr/title.txt
new file mode 100644
index 0000000..bb4e37b
--- /dev/null
+++ b/fastlane/metadata/android/fr/title.txt
@@ -0,0 +1 @@
+Nihonoari: Hiragana & Katakana
\ No newline at end of file
diff --git a/fastlane/metadata/android/ru/changelogs/4.txt b/fastlane/metadata/android/ru/changelogs/4.txt
new file mode 100644
index 0000000..3280303
--- /dev/null
+++ b/fastlane/metadata/android/ru/changelogs/4.txt
@@ -0,0 +1 @@
+Fix some errors.
\ No newline at end of file
diff --git a/fastlane/metadata/android/ru/changelogs/5.txt b/fastlane/metadata/android/ru/changelogs/5.txt
new file mode 100644
index 0000000..30a47bb
--- /dev/null
+++ b/fastlane/metadata/android/ru/changelogs/5.txt
@@ -0,0 +1,4 @@
+* Set selection in Hiragana and Katakana
+* Improved quiz core
+* Fixed "ri" Katakana
+* Improved dark style
\ No newline at end of file
diff --git a/fastlane/metadata/android/ru/changelogs/6.txt b/fastlane/metadata/android/ru/changelogs/6.txt
new file mode 100644
index 0000000..2b55d9f
--- /dev/null
+++ b/fastlane/metadata/android/ru/changelogs/6.txt
@@ -0,0 +1,2 @@
+* Spaced repetition algorithm
+* The keyboard does not close after submit
\ No newline at end of file
diff --git a/fastlane/metadata/android/ru/changelogs/7.txt b/fastlane/metadata/android/ru/changelogs/7.txt
new file mode 100644
index 0000000..e0f91a4
--- /dev/null
+++ b/fastlane/metadata/android/ru/changelogs/7.txt
@@ -0,0 +1,2 @@
+* The selected Kana sets are remembered
+* Added UI translation
\ No newline at end of file
diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt
new file mode 100644
index 0000000..828c6e2
--- /dev/null
+++ b/fastlane/metadata/android/ru/full_description.txt
@@ -0,0 +1,4 @@
+Нихоноари - это проект с открытым исходным кодом, что предоставляет обществу простое приложение для запоминания и практикования алфавитов Хираганы и Катаканы без реклам, внутренних покупок и бесполезных функцый. Чем проще - тем лучше.
+
+Хотите сотрудничать с проектом или известить о некоторых ошибках?
+https://github.com/aeri/Nihonoari-App
diff --git a/fastlane/metadata/android/ru/images/icon.png b/fastlane/metadata/android/ru/images/icon.png
new file mode 100644
index 0000000..5512fa9
Binary files /dev/null and b/fastlane/metadata/android/ru/images/icon.png differ
diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/1.png b/fastlane/metadata/android/ru/images/phoneScreenshots/1.png
new file mode 100644
index 0000000..adb4923
Binary files /dev/null and b/fastlane/metadata/android/ru/images/phoneScreenshots/1.png differ
diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/2.png b/fastlane/metadata/android/ru/images/phoneScreenshots/2.png
new file mode 100644
index 0000000..7de0cd0
Binary files /dev/null and b/fastlane/metadata/android/ru/images/phoneScreenshots/2.png differ
diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/3.png b/fastlane/metadata/android/ru/images/phoneScreenshots/3.png
new file mode 100644
index 0000000..1ed14be
Binary files /dev/null and b/fastlane/metadata/android/ru/images/phoneScreenshots/3.png differ
diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/4.png b/fastlane/metadata/android/ru/images/phoneScreenshots/4.png
new file mode 100644
index 0000000..37e38fc
Binary files /dev/null and b/fastlane/metadata/android/ru/images/phoneScreenshots/4.png differ
diff --git a/fastlane/metadata/android/ru/images/phoneScreenshots/5.png b/fastlane/metadata/android/ru/images/phoneScreenshots/5.png
new file mode 100644
index 0000000..3edbc1f
Binary files /dev/null and b/fastlane/metadata/android/ru/images/phoneScreenshots/5.png differ
diff --git a/fastlane/metadata/android/ru/short_description.txt b/fastlane/metadata/android/ru/short_description.txt
new file mode 100644
index 0000000..64ca210
--- /dev/null
+++ b/fastlane/metadata/android/ru/short_description.txt
@@ -0,0 +1 @@
+Небольшой да простой тренер японских кан
diff --git a/fastlane/metadata/android/ru/title.txt b/fastlane/metadata/android/ru/title.txt
new file mode 100644
index 0000000..36b0010
--- /dev/null
+++ b/fastlane/metadata/android/ru/title.txt
@@ -0,0 +1 @@
+Нихоноари: Хирагана и Катакана
diff --git a/fastlane/metadata/android/uk/changelogs/4.txt b/fastlane/metadata/android/uk/changelogs/4.txt
new file mode 100644
index 0000000..3280303
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/4.txt
@@ -0,0 +1 @@
+Fix some errors.
\ No newline at end of file
diff --git a/fastlane/metadata/android/uk/changelogs/5.txt b/fastlane/metadata/android/uk/changelogs/5.txt
new file mode 100644
index 0000000..30a47bb
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/5.txt
@@ -0,0 +1,4 @@
+* Set selection in Hiragana and Katakana
+* Improved quiz core
+* Fixed "ri" Katakana
+* Improved dark style
\ No newline at end of file
diff --git a/fastlane/metadata/android/uk/changelogs/6.txt b/fastlane/metadata/android/uk/changelogs/6.txt
new file mode 100644
index 0000000..2b55d9f
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/6.txt
@@ -0,0 +1,2 @@
+* Spaced repetition algorithm
+* The keyboard does not close after submit
\ No newline at end of file
diff --git a/fastlane/metadata/android/uk/changelogs/7.txt b/fastlane/metadata/android/uk/changelogs/7.txt
new file mode 100644
index 0000000..e0f91a4
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/7.txt
@@ -0,0 +1,2 @@
+* The selected Kana sets are remembered
+* Added UI translation
\ No newline at end of file
diff --git a/fastlane/metadata/android/uk/full_description.txt b/fastlane/metadata/android/uk/full_description.txt
new file mode 100644
index 0000000..1cf83d6
--- /dev/null
+++ b/fastlane/metadata/android/uk/full_description.txt
@@ -0,0 +1,4 @@
+Ніхоноарі - це проект з відкритим кодом, що надає спільноті простий застосунок для запам'ятовування та практикування абеток Хіраґани та Катакани без реклам, купівель, чи безтолкових функцій. Чим простіше - тим краще.
+
+Хочете співпрацювати з проектом, або повідомити кілька помилок?
+https://github.com/aeri/Nihonoari-App
diff --git a/fastlane/metadata/android/uk/images/icon.png b/fastlane/metadata/android/uk/images/icon.png
new file mode 100644
index 0000000..5512fa9
Binary files /dev/null and b/fastlane/metadata/android/uk/images/icon.png differ
diff --git a/fastlane/metadata/android/uk/images/phoneScreenshots/1.png b/fastlane/metadata/android/uk/images/phoneScreenshots/1.png
new file mode 100644
index 0000000..adb4923
Binary files /dev/null and b/fastlane/metadata/android/uk/images/phoneScreenshots/1.png differ
diff --git a/fastlane/metadata/android/uk/images/phoneScreenshots/2.png b/fastlane/metadata/android/uk/images/phoneScreenshots/2.png
new file mode 100644
index 0000000..7de0cd0
Binary files /dev/null and b/fastlane/metadata/android/uk/images/phoneScreenshots/2.png differ
diff --git a/fastlane/metadata/android/uk/images/phoneScreenshots/3.png b/fastlane/metadata/android/uk/images/phoneScreenshots/3.png
new file mode 100644
index 0000000..1ed14be
Binary files /dev/null and b/fastlane/metadata/android/uk/images/phoneScreenshots/3.png differ
diff --git a/fastlane/metadata/android/uk/images/phoneScreenshots/4.png b/fastlane/metadata/android/uk/images/phoneScreenshots/4.png
new file mode 100644
index 0000000..37e38fc
Binary files /dev/null and b/fastlane/metadata/android/uk/images/phoneScreenshots/4.png differ
diff --git a/fastlane/metadata/android/uk/images/phoneScreenshots/5.png b/fastlane/metadata/android/uk/images/phoneScreenshots/5.png
new file mode 100644
index 0000000..3edbc1f
Binary files /dev/null and b/fastlane/metadata/android/uk/images/phoneScreenshots/5.png differ
diff --git a/fastlane/metadata/android/uk/short_description.txt b/fastlane/metadata/android/uk/short_description.txt
new file mode 100644
index 0000000..8b55a3c
--- /dev/null
+++ b/fastlane/metadata/android/uk/short_description.txt
@@ -0,0 +1 @@
+Невеличкий та простий тренер японських кан
diff --git a/fastlane/metadata/android/uk/title.txt b/fastlane/metadata/android/uk/title.txt
new file mode 100644
index 0000000..9744ccf
--- /dev/null
+++ b/fastlane/metadata/android/uk/title.txt
@@ -0,0 +1 @@
+Ніхоноарі: Хіраґана та Катакана
diff --git a/i18n/en.json b/i18n/en.json
new file mode 100644
index 0000000..c994fd0
--- /dev/null
+++ b/i18n/en.json
@@ -0,0 +1,14 @@
+{
+ "main_licenses": "LICENSES",
+ "main_hiragana" : "Include Hiragana syllabary",
+ "main_katakana" : "Include Katakana syllabary",
+ "main_select": "Select one",
+ "main_start": "Start",
+ "quiz_stats": "Statistics",
+ "quiz_total": "Total",
+ "quiz_passed": "Passed",
+ "quiz_failed": "Failed",
+ "quiz_rate": "Success rate",
+ "quiz_enter": "Enter rōmaji",
+ "quiz_correct": "Correct answer"
+}
\ No newline at end of file
diff --git a/i18n/es.json b/i18n/es.json
new file mode 100644
index 0000000..923453a
--- /dev/null
+++ b/i18n/es.json
@@ -0,0 +1,14 @@
+{
+ "main_licenses": "LICENCIAS",
+ "main_hiragana" : "Incluir silabario Hiragana",
+ "main_katakana" : "Incluir silabario Katakana",
+ "main_select": "Selecciona",
+ "main_start": "Inciar",
+ "quiz_stats": "Estadísticas",
+ "quiz_total": "Total",
+ "quiz_passed": "Aciertos",
+ "quiz_failed": "Fallos",
+ "quiz_rate": "Tasa de acierto",
+ "quiz_enter": "Escribe rōmaji",
+ "quiz_correct": "Respuesta correcta"
+}
\ No newline at end of file
diff --git a/i18n/fr.json b/i18n/fr.json
new file mode 100644
index 0000000..a37c87d
--- /dev/null
+++ b/i18n/fr.json
@@ -0,0 +1,14 @@
+{
+ "main_licenses": "LICENCES",
+ "main_hiragana" : "Incorporer syllabaire Hiragana",
+ "main_katakana" : "Incorporer syllabaire Katakana",
+ "main_select": "Choisis",
+ "main_start": "Commencer",
+ "quiz_stats": "Statistiques",
+ "quiz_total": "Total",
+ "quiz_passed": "Coups",
+ "quiz_failed": "Ratés",
+ "quiz_rate": "Taux de succès",
+ "quiz_enter": "Écris rōmaji",
+ "quiz_correct": "Réponse correcte"
+}
diff --git a/i18n/ru.json b/i18n/ru.json
new file mode 100644
index 0000000..2022537
--- /dev/null
+++ b/i18n/ru.json
@@ -0,0 +1,14 @@
+{
+ "main_licenses": "ЛИЦЕНЗИИ",
+ "main_hiragana" : "Включить слоги Хираганы",
+ "main_katakana" : "Включить слоги Катаканы",
+ "main_select": "Выберите что-то",
+ "main_start": "Начать",
+ "quiz_stats": "Статистика",
+ "quiz_total": "Всего",
+ "quiz_passed": "Пройдено",
+ "quiz_failed": "Провалено",
+ "quiz_rate": "Процент успеха",
+ "quiz_enter": "Введите ромадзи",
+ "quiz_correct": "Ответ верный"
+}
diff --git a/i18n/uk.json b/i18n/uk.json
new file mode 100644
index 0000000..3449ee2
--- /dev/null
+++ b/i18n/uk.json
@@ -0,0 +1,14 @@
+{
+ "main_licenses": "ЛІЦЕНЗІЇ",
+ "main_hiragana" : "Включити склади Хіраґани",
+ "main_katakana" : "Включити склади Катакани",
+ "main_select": "Виберіть щось",
+ "main_start": "Почати",
+ "quiz_stats": "Статистика",
+ "quiz_total": "Всього",
+ "quiz_passed": "Правильних",
+ "quiz_failed": "Помилкових",
+ "quiz_rate": "Відсоток успіху",
+ "quiz_enter": "Введіть ромадзі",
+ "quiz_correct": "Відповідь вірна"
+}
diff --git a/ios/Flutter/Generated.xcconfig b/ios/Flutter/Generated.xcconfig
index 2d61f67..321eed9 100644
--- a/ios/Flutter/Generated.xcconfig
+++ b/ios/Flutter/Generated.xcconfig
@@ -6,5 +6,5 @@ FLUTTER_BUILD_DIR=build
SYMROOT=${SOURCE_ROOT}/../build\ios
OTHER_LDFLAGS=$(inherited) -framework Flutter
FLUTTER_FRAMEWORK_DIR=C:\src\flutter\bin\cache\artifacts\engine\ios
-FLUTTER_BUILD_NAME=1.3.0
-FLUTTER_BUILD_NUMBER=5
+FLUTTER_BUILD_NAME=1.5.0
+FLUTTER_BUILD_NUMBER=7
diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh
new file mode 100644
index 0000000..1da9d0d
--- /dev/null
+++ b/ios/Flutter/flutter_export_environment.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+# This is a generated file; do not edit or check into version control.
+export "FLUTTER_ROOT=C:\src\flutter"
+export "FLUTTER_APPLICATION_PATH=D:\Documentos\Nihonoari-App"
+export "FLUTTER_TARGET=lib\main.dart"
+export "FLUTTER_BUILD_DIR=build"
+export "SYMROOT=${SOURCE_ROOT}/../build\ios"
+export "OTHER_LDFLAGS=$(inherited) -framework Flutter"
+export "FLUTTER_FRAMEWORK_DIR=C:\src\flutter\bin\cache\artifacts\engine\ios"
+export "FLUTTER_BUILD_NAME=1.5.0"
+export "FLUTTER_BUILD_NUMBER=7"
diff --git a/ios/Runner/GeneratedPluginRegistrant.m b/ios/Runner/GeneratedPluginRegistrant.m
index 60dfa42..429aa2a 100644
--- a/ios/Runner/GeneratedPluginRegistrant.m
+++ b/ios/Runner/GeneratedPluginRegistrant.m
@@ -4,9 +4,16 @@
#import "GeneratedPluginRegistrant.h"
+#if __has_include()
+#import
+#else
+@import shared_preferences;
+#endif
+
@implementation GeneratedPluginRegistrant
+ (void)registerWithRegistry:(NSObject*)registry {
+ [FLTSharedPreferencesPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTSharedPreferencesPlugin"]];
}
@end
diff --git a/lib/Question.dart b/lib/Question.dart
index 2301161..25aea59 100644
--- a/lib/Question.dart
+++ b/lib/Question.dart
@@ -1,3 +1,22 @@
+/*
+ Copyright (C) 2020 Naval Alcalá
+
+ This file is part of Nihonoari.
+
+ Nihonoari is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Nihonoari is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Nihonoari. If not, see .
+ */
+
class Question{
String question;
diff --git a/lib/localizations.dart b/lib/localizations.dart
new file mode 100644
index 0000000..4bc3b4e
--- /dev/null
+++ b/lib/localizations.dart
@@ -0,0 +1,85 @@
+/*
+ Copyright (C) 2020 Naval Alcalá
+
+ This file is part of Nihonoari.
+
+ Nihonoari is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Nihonoari is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Nihonoari. If not, see .
+ */
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+
+class AppLocalizations {
+ final Locale locale;
+
+ AppLocalizations(this.locale);
+
+ // Helper method to keep the code in the widgets concise
+ // Localizations are accessed using an InheritedWidget "of" syntax
+ static AppLocalizations of(BuildContext context) {
+ return Localizations.of(context, AppLocalizations);
+ }
+
+ // Static member to have a simple access to the delegate from the MaterialApp
+ static const LocalizationsDelegate delegate =
+ _AppLocalizationsDelegate();
+
+ Map _localizedStrings;
+
+ Future load() async {
+ // Load the language JSON file from the "lang" folder
+ String jsonString =
+ await rootBundle.loadString('i18n/${locale.languageCode}.json');
+ Map jsonMap = json.decode(jsonString);
+
+ _localizedStrings = jsonMap.map((key, value) {
+ return MapEntry(key, value.toString());
+ });
+
+ return true;
+ }
+
+ // This method will be called from every widget which needs a localized text
+ String translate(String key) {
+ return _localizedStrings[key];
+ }
+}
+
+class _AppLocalizationsDelegate
+ extends LocalizationsDelegate {
+ // This delegate instance will never change (it doesn't even have fields!)
+ // It can provide a constant constructor.
+ const _AppLocalizationsDelegate();
+
+ @override
+ bool isSupported(Locale locale) {
+ // Supported language codes here
+ return ['en', 'es', 'fr', 'uk', 'ru'].contains(locale.languageCode);
+
+ }
+
+ @override
+ Future load(Locale locale) async {
+ // AppLocalizations class is where the JSON loading actually runs
+ AppLocalizations localizations = new AppLocalizations(locale);
+ await localizations.load();
+ return localizations;
+ }
+
+ @override
+ bool shouldReload(_AppLocalizationsDelegate old) => false;
+}
diff --git a/lib/main.dart b/lib/main.dart
index f443ebc..51d520e 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,7 +1,32 @@
+/*
+ Copyright (C) 2020 Naval Alcalá
+
+ This file is part of Nihonoari.
+
+ Nihonoari is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Nihonoari is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Nihonoari. If not, see .
+ */
+
+import 'dart:convert';
+
+import 'preferences.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_localizations/flutter_localizations.dart';
import 'party.dart';
import 'package:flutter/gestures.dart';
+import 'localizations.dart';
+
import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;
@@ -9,8 +34,26 @@ Future loadAsset() async {
return await rootBundle.loadString('assets/LICENSES.txt');
}
-void main() {
+
+Map _hirasol = new Map();
+
+Map _katasol = new Map();
+
+Future main() async {
+
runApp(new MaterialApp(
+ supportedLocales: [
+ Locale('en', 'US'),
+ Locale('es', ''),
+ Locale('fr', ''),
+ Locale('uk', ''),
+ Locale('ru', ''),
+ ],
+ localizationsDelegates: [
+ AppLocalizations.delegate,
+ GlobalMaterialLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ ],
home: new MyApp(),
));
}
@@ -30,34 +73,6 @@ class kataDialog extends StatefulWidget {
_kataDialogState createState() => _kataDialogState();
}
-Map _hirasol = {
- 'あ い う え お': true,
- 'か き く け こ': true,
- 'さ し す せ そ': true,
- 'た ち つ て と': true,
- 'な に ぬ ね の': true,
- 'は ひ ふ へ ほ': true,
- 'ま み む め も': true,
- 'や ゆ よ': true,
- 'ら り る れ ろ': true,
- 'わ を': true,
- 'ん': true
-};
-
-Map _katasol = {
- 'ア イ ウ エ オ': true,
- 'カ キ ク ケ コ': true,
- 'サ シ ス セ ソ': true,
- 'タ チ ツ テ ト': true,
- 'ナ ニ ヌ ネ ノ': true,
- 'ハ ヒ フ ヘ ホ': true,
- 'マ ミ ム メ モ': true,
- 'ヤ ユ ヨ': true,
- 'ラ リ ル レ ロ': true,
- 'ワ ヲ': true,
- 'ン': true,
-};
-
class _hiraDialogState extends State {
@override
Widget build(BuildContext context) {
@@ -167,6 +182,19 @@ class _State extends State {
bool _katakana = false;
bool _hiragana = false;
+
+ @override
+ void initState() {
+ super.initState();
+ readData();
+ }
+
+ Future readData() async {
+ await SharedKanaPreferences.init();
+ _hirasol = json.decode(SharedKanaPreferences.getHiraganaSet());
+ _katasol = json.decode(SharedKanaPreferences.getKatakanaSet());
+ }
+
bool _isButtonDisabled = true;
//we omitted the brackets '{}' and are using fat arrow '=>' instead, this is dart syntax
@@ -186,7 +214,7 @@ class _State extends State {
builder: (BuildContext context) {
// return object of type Dialog
return AlertDialog(
- title: new Text("Licenses"),
+ title: Text("Licenses"),
content: new SingleChildScrollView(
child: Text(data),
),
@@ -246,7 +274,7 @@ class _State extends State {
padding: EdgeInsets.all(5),
child: RichText(
text: TextSpan(
- text: 'LICENSES',
+ text: AppLocalizations.of(context).translate('main_licenses'),
recognizer: TapGestureRecognizer()
..onTap = () {
_showLicense();
@@ -291,7 +319,7 @@ class _State extends State {
),
controlAffinity: ListTileControlAffinity.leading,
subtitle: new Text(
- 'Include Hiragana syllabary',
+ (AppLocalizations.of(context).translate('main_hiragana')),
style: TextStyle(
color: Colors.white,
),
@@ -329,7 +357,7 @@ class _State extends State {
),
controlAffinity: ListTileControlAffinity.leading,
subtitle: new Text(
- 'Include Katakana syllabary',
+ (AppLocalizations.of(context).translate('main_katakana')),
style: TextStyle(
color: Colors.white,
),
@@ -366,7 +394,10 @@ class _State extends State {
);
},
child: new Text(
- _isButtonDisabled ? "Select one" : "Start"),
+ _isButtonDisabled ?
+ (AppLocalizations.of(context).translate('main_select'))
+ :
+ (AppLocalizations.of(context).translate('main_start'))),
),
),
),
diff --git a/lib/party.dart b/lib/party.dart
index a9b0599..5581b8f 100644
--- a/lib/party.dart
+++ b/lib/party.dart
@@ -1,4 +1,26 @@
+/*
+ Copyright (C) 2020 Naval Alcalá
+
+ This file is part of Nihonoari.
+
+ Nihonoari is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Nihonoari is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Nihonoari. If not, see .
+ */
+
+import 'package:Nihonoari/preferences.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_localizations/flutter_localizations.dart';
+import 'localizations.dart';
import 'quiz_brain.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'table.dart';
@@ -8,26 +30,43 @@ import 'table.dart';
Color _result = Colors.white;
class Party extends StatefulWidget {
-
final bool h, k;
- final Map hv, kv;
+ final Map hv, kv;
- Party({@required this.h, @required this.hv, @required this.k, @required this.kv});
+ Party(
+ {@required this.h,
+ @required this.hv,
+ @required this.k,
+ @required this.kv});
@override
_Party createState() => _Party(h, hv, k, kv);
}
class _Party extends State {
-
_Party(h, hv, k, kv) {
+ SharedKanaPreferences.setHiraganaSet(hv);
+ SharedKanaPreferences.setKatakanaSet(kv);
+
QuizBrain.setList(h, hv, k, kv);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
+ supportedLocales: [
+ Locale('en', 'US'),
+ Locale('es', ''),
+ Locale('fr', ''),
+ Locale('uk', ''),
+ Locale('ru', ''),
+ ],
+ localizationsDelegates: [
+ AppLocalizations.delegate,
+ GlobalMaterialLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ ],
home: Scaffold(
backgroundColor: Colors.grey.shade900,
body: SafeArea(
@@ -47,7 +86,6 @@ class QuizPage extends StatefulWidget {
}
class _QuizPageState extends State {
-
FocusNode _focusNode = FocusNode();
bool _ignore = false;
@@ -71,7 +109,7 @@ class _QuizPageState extends State {
});
}
- void _showDialog() async{
+ void _showDialog() async {
// flutter defined function
Scaffold.of(context).hideCurrentSnackBar();
showDialog(
@@ -80,18 +118,18 @@ class _QuizPageState extends State {
// return object of type Dialog
return AlertDialog(
backgroundColor: Colors.black,
- title: new Text("Statistics",
+ title: new Text(AppLocalizations.of(context).translate('quiz_stats'),
style: TextStyle(
color: Colors.white,
)),
- content: new Text("Total: $total\n"
- "Passed: $accepted\n"
- "Failed: $rejected\n"
- "Success rate: ${ratio.toStringAsFixed(2)}%",
+ content: new Text(
+ "${AppLocalizations.of(context).translate('quiz_total')}: $total\n"
+ "${AppLocalizations.of(context).translate('quiz_passed')}: $accepted\n"
+ "${AppLocalizations.of(context).translate('quiz_failed')}: $rejected\n"
+ "${AppLocalizations.of(context).translate('quiz_rate')}: ${ratio.toStringAsFixed(2)}%",
style: TextStyle(
color: Colors.white,
)),
-
actions: [
// usually buttons at the bottom of the dialog
new FlatButton(
@@ -116,38 +154,33 @@ class _QuizPageState extends State {
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expanded(
- flex: 0,
- child: Row(
- children: [
- Expanded(
- child: IconButton(
- // Use the FontAwesomeIcons class for the IconData
- icon: new Icon(
- FontAwesomeIcons.language,
- color: Colors.white),
- onPressed: () {
- FocusScope.of(context).requestFocus(new FocusNode());
- Navigator.push(
- context,
- MaterialPageRoute(builder: (context) => BasicGridView()),
- ); }
- )
- ),
- Expanded(
- child: IconButton(
- // Use the FontAwesomeIcons class for the IconData
- icon: new Icon(
- FontAwesomeIcons.chartBar,
- color: Colors.white),
- onPressed: () {
- FocusScope.of(context).requestFocus(new FocusNode());
- _showDialog(); }
- )
- ),
-
- ],
- )
- ),
+ flex: 0,
+ child: Row(
+ children: [
+ Expanded(
+ child: IconButton(
+ // Use the FontAwesomeIcons class for the IconData
+ icon: new Icon(FontAwesomeIcons.language,
+ color: Colors.white),
+ onPressed: () {
+ FocusScope.of(context).requestFocus(new FocusNode());
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => BasicGridView()),
+ );
+ })),
+ Expanded(
+ child: IconButton(
+ // Use the FontAwesomeIcons class for the IconData
+ icon: new Icon(FontAwesomeIcons.chartBar,
+ color: Colors.white),
+ onPressed: () {
+ FocusScope.of(context).requestFocus(new FocusNode());
+ _showDialog();
+ })),
+ ],
+ )),
Expanded(
flex: 4,
child: Padding(
@@ -167,104 +200,85 @@ class _QuizPageState extends State {
),
Expanded(
child: Padding(
- padding: EdgeInsets.all(15.0),
- child: TextField(
- textInputAction: TextInputAction.done,
- controller: _controller,
- focusNode: _focusNode,
- autofocus: true,
- textAlign: TextAlign.center ,
- cursorColor: Colors.white,
- decoration: InputDecoration(
- hoverColor: Colors.white,
- fillColor: Colors.white,
- focusColor: Colors.white,
+ padding: EdgeInsets.all(15.0),
+ child: TextField(
+ textInputAction: TextInputAction.done,
+ controller: _controller,
+ focusNode: _focusNode,
+ autofocus: true,
+ textAlign: TextAlign.center,
+ cursorColor: Colors.white,
+ decoration: InputDecoration(
+ hoverColor: Colors.white,
+ fillColor: Colors.white,
+ focusColor: Colors.white,
border: InputBorder.none,
- hintText: 'Enter rōmaji',
- hintStyle: TextStyle(color: Colors.grey),
-
- ),
- style: TextStyle(
- fontSize: 20,
- color: Colors.white,
- ),
- onSubmitted: (value) {
-
- if (_ignore || value.length < 1){
- return;
- }
- _ignore = true;
-
- int control = 0;
- bool passed;
-
-
- _controller.clear();
-
- String result = QuizBrain.currentQuestion.answer;
-
- ++total;
-
- setState(() {
- if (result == value.toLowerCase()) {
- control = 500;
- print("OK");
- _result = Colors.green;
- ++accepted;
- passed = true;
- }
- else{
- control = 2000;
- print ("NO");
- _result = Colors.red;
- ++rejected;
- passed = false;
-
- final snackBar = SnackBar(
- elevation: 10,
- duration: Duration(milliseconds: control) ,
- content: Text('Correct answer: $result',
- style: TextStyle(
- fontSize: 20,
- color: Colors.white,
- fontWeight: FontWeight.bold),
- textAlign: TextAlign.center,
- ),
-
-
- );
-
- Scaffold.of(context).showSnackBar(snackBar);
-
+ hintText:
+ AppLocalizations.of(context).translate('quiz_enter'),
+ hintStyle: TextStyle(color: Colors.grey),
+ ),
+ style: TextStyle(
+ fontSize: 20,
+ color: Colors.white,
+ ),
+ onSubmitted: (value) {
+ if (_ignore || value.length < 1) {
+ return;
}
- });
+ _ignore = true;
+ int control = 0;
+ bool passed;
+ _controller.clear();
- ratio = (accepted/total)*100;
-
-
-
- Future.delayed(Duration(milliseconds: control), () {
+ String result = QuizBrain.currentQuestion.answer;
+ ++total;
setState(() {
- _result = Colors.white;
- QuizBrain.nextQuestion(passed);
- _ignore = false;
+ if (result == value.toLowerCase()) {
+ control = 500;
+ print("OK");
+ _result = Colors.green;
+ ++accepted;
+ passed = true;
+ } else {
+ control = 2000;
+ print("NO");
+ _result = Colors.red;
+ ++rejected;
+ passed = false;
+
+ final snackBar = SnackBar(
+ elevation: 10,
+ duration: Duration(milliseconds: control),
+ content: Text(
+ '${AppLocalizations.of(context).translate('quiz_correct')}: $result',
+ style: TextStyle(
+ fontSize: 20,
+ color: Colors.white,
+ fontWeight: FontWeight.bold),
+ textAlign: TextAlign.center,
+ ),
+ );
+
+ Scaffold.of(context).showSnackBar(snackBar);
+ }
});
- });
-
-
-
+ ratio = (accepted / total) * 100;
- },
- )
-
- ),
+ Future.delayed(Duration(milliseconds: control), () {
+ setState(() {
+ _result = Colors.white;
+ QuizBrain.nextQuestion(passed);
+ _ignore = false;
+ });
+ });
+ },
+ )),
),
-
Expanded(
child: Row(
children: scoreKeeper,
diff --git a/lib/preferences.dart b/lib/preferences.dart
new file mode 100644
index 0000000..c70e8a5
--- /dev/null
+++ b/lib/preferences.dart
@@ -0,0 +1,94 @@
+/*
+ Copyright (C) 2020 Naval Alcalá
+
+ This file is part of Nihonoari.
+
+ Nihonoari is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Nihonoari is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Nihonoari. If not, see .
+ */
+import 'package:shared_preferences/shared_preferences.dart';
+import 'dart:convert';
+
+class SharedKanaPreferences {
+ static Future get _instance async =>
+ _prefsInstance ??= await SharedPreferences.getInstance();
+ static SharedPreferences _prefsInstance;
+
+ static Future init() async {
+ _prefsInstance = await _instance;
+ return _prefsInstance;
+ }
+
+ static Map _defaultHiraganaSet = {
+ 'あ い う え お': true,
+ 'か き く け こ': true,
+ 'さ し す せ そ': true,
+ 'た ち つ て と': true,
+ 'な に ぬ ね の': true,
+ 'は ひ ふ へ ほ': true,
+ 'ま み む め も': true,
+ 'や ゆ よ': true,
+ 'ら り る れ ろ': true,
+ 'わ を': true,
+ 'ん': true
+ };
+
+ static Map _defaultKatakanaSet = {
+ 'ア イ ウ エ オ': true,
+ 'カ キ ク ケ コ': true,
+ 'サ シ ス セ ソ': true,
+ 'タ チ ツ テ ト': true,
+ 'ナ ニ ヌ ネ ノ': true,
+ 'ハ ヒ フ ヘ ホ': true,
+ 'マ ミ ム メ モ': true,
+ 'ヤ ユ ヨ': true,
+ 'ラ リ ル レ ロ': true,
+ 'ワ ヲ': true,
+ 'ン': true,
+ };
+
+ static final String _hirasolSet = "hiragana";
+ static final String _katasolSet = "katakana";
+
+ static String getHiraganaSet() {
+ var hiraganaData = _prefsInstance.getString(_hirasolSet);
+
+ if (hiraganaData == null) {
+ print("EMPTY HIRAGANA");
+ return json.encode(_defaultHiraganaSet);
+ } else {
+ print("EXISTS HIRAGANA");
+ return hiraganaData;
+ }
+ }
+
+ static Future setHiraganaSet(Map value) async {
+ return _prefsInstance.setString(_hirasolSet, json.encode(value));
+ }
+
+ static String getKatakanaSet() {
+ var katakanaData = _prefsInstance.getString(_katasolSet);
+
+ if (katakanaData == null) {
+ print("EMPTY KATAKANA");
+ return json.encode(_defaultKatakanaSet);
+ } else {
+ print("EXISTS KATAKANA");
+ return katakanaData;
+ }
+ }
+
+ static Future setKatakanaSet(Map value) async {
+ return _prefsInstance.setString(_katasolSet, json.encode(value));
+ }
+}
diff --git a/lib/quiz_brain.dart b/lib/quiz_brain.dart
index 5a661de..a4604a2 100644
--- a/lib/quiz_brain.dart
+++ b/lib/quiz_brain.dart
@@ -1,3 +1,22 @@
+/*
+ Copyright (C) 2020 Naval Alcalá
+
+ This file is part of Nihonoari.
+
+ Nihonoari is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Nihonoari is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Nihonoari. If not, see .
+ */
+
import 'Question.dart';
import 'dart:math';
@@ -201,26 +220,22 @@ class QuizBrain {
};
static void nextQuestion(bool passed) {
-
- if (passed){
- _passed.add (currentQuestion);
+ if (passed) {
+ _passed.add(currentQuestion);
_quiz.remove(currentQuestion);
- }
- else{
- _failed.add (currentQuestion);
+ } else {
+ _failed.add(currentQuestion);
_quiz.remove(currentQuestion);
}
- if (_quiz.length == 0){
- if (_failed.length == 0){
+ if (_quiz.length == 0) {
+ if (_failed.length == 0) {
_quiz.addAll(_passed);
_passed.clear();
- }
- else{
+ } else {
_quiz.addAll(_failed);
_failed.clear();
}
-
}
int _questionNumber = rng.nextInt(_quiz.length);
currentQuestion = _quiz[_questionNumber];
@@ -229,11 +244,10 @@ class QuizBrain {
static void firstQuestion() {
int _questionNumber = rng.nextInt(_quiz.length);
currentQuestion = _quiz[_questionNumber];
-
}
static void setList(
- bool h, Map hv, bool k, Map kv) {
+ bool h, Map hv, bool k, Map kv) {
QuizBrain.h = h;
QuizBrain.k = k;
diff --git a/lib/table.dart b/lib/table.dart
index d978710..051cb67 100644
--- a/lib/table.dart
+++ b/lib/table.dart
@@ -1,3 +1,22 @@
+/*
+ Copyright (C) 2020 Naval Alcalá
+
+ This file is part of Nihonoari.
+
+ Nihonoari is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Nihonoari is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Nihonoari. If not, see .
+ */
+
import 'package:flutter/material.dart';
import 'package:kana/kana.dart';
diff --git a/pubspec.yaml b/pubspec.yaml
index 40faa5c..971bbf6 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -8,7 +8,7 @@ description: A little Japanese Kana training
# build by specifying --build-name and --build-number, respectively.
# Read more about versioning at semver.org.
-version: 1.4.0+6
+version: 1.5.0+7
environment:
sdk: ">=2.0.0-dev.68.0 <3.0.0"
@@ -16,8 +16,11 @@ environment:
dependencies:
kana: ^1.0.0
font_awesome_flutter: ^8.5.0
+ shared_preferences: ^0.5.12
flutter:
sdk: flutter
+ flutter_localizations:
+ sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
@@ -41,6 +44,11 @@ flutter:
- asset: assets/apple-tp_text.ttf
assets:
- assets/LICENSES.txt
+ - i18n/es.json
+ - i18n/en.json
+ - i18n/fr.json
+ - i18n/uk.json
+ - i18n/ru.json
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in