Auto-sync: 20260305_150000
This commit is contained in:
parent
434ea96444
commit
b2b94a5e72
32 changed files with 1146 additions and 53 deletions
BIN
.DS_Store
vendored
BIN
.DS_Store
vendored
Binary file not shown.
|
|
@ -9,7 +9,7 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "com.sanza.tetraq"
|
namespace = "com.amastra.tetraq"
|
||||||
compileSdk = flutter.compileSdkVersion
|
compileSdk = flutter.compileSdkVersion
|
||||||
ndkVersion = flutter.ndkVersion
|
ndkVersion = flutter.ndkVersion
|
||||||
|
|
||||||
|
|
@ -24,7 +24,7 @@ android {
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||||
applicationId = "com.sanza.tetraq"
|
applicationId = "com.amastra.tetraq"
|
||||||
// You can update the following values to match your application needs.
|
// You can update the following values to match your application needs.
|
||||||
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
||||||
minSdk = flutter.minSdkVersion
|
minSdk = flutter.minSdkVersion
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,25 @@
|
||||||
"storage_bucket": "tetraq-32a4a.firebasestorage.app"
|
"storage_bucket": "tetraq-32a4a.firebasestorage.app"
|
||||||
},
|
},
|
||||||
"client": [
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:705460445314:android:ceac21bb06b7a9f07b949b",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.amastra.tetraq"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyBsXO595xVITDPrRnXrW8HPQLOe7Rz4Gg4"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"client_info": {
|
"client_info": {
|
||||||
"mobilesdk_app_id": "1:705460445314:android:4d35fef29cfd63727b949b",
|
"mobilesdk_app_id": "1:705460445314:android:4d35fef29cfd63727b949b",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.sanza.tetraq
|
package com.amastra.tetraq
|
||||||
|
|
||||||
import io.flutter.embedding.android.FlutterActivity
|
import io.flutter.embedding.android.FlutterActivity
|
||||||
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
{"flutter":{"platforms":{"android":{"default":{"projectId":"tetraq-32a4a","appId":"1:705460445314:android:4d35fef29cfd63727b949b","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"tetraq-32a4a","appId":"1:705460445314:ios:da11cbca5d1f6bc27b949b","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"macos":{"default":{"projectId":"tetraq-32a4a","appId":"1:705460445314:ios:da11cbca5d1f6bc27b949b","uploadDebugSymbols":false,"fileOutput":"macos/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"tetraq-32a4a","configurations":{"android":"1:705460445314:android:4d35fef29cfd63727b949b","ios":"1:705460445314:ios:da11cbca5d1f6bc27b949b","macos":"1:705460445314:ios:da11cbca5d1f6bc27b949b"}}}}}}
|
{"flutter":{"platforms":{"android":{"default":{"projectId":"tetraq-32a4a","appId":"1:705460445314:android:ceac21bb06b7a9f07b949b","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"tetraq-32a4a","appId":"1:705460445314:ios:54d64cb7592954327b949b","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"macos":{"default":{"projectId":"tetraq-32a4a","appId":"1:705460445314:ios:da11cbca5d1f6bc27b949b","uploadDebugSymbols":false,"fileOutput":"macos/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"tetraq-32a4a","configurations":{"android":"1:705460445314:android:ceac21bb06b7a9f07b949b","ios":"1:705460445314:ios:54d64cb7592954327b949b","macos":"1:705460445314:ios:da11cbca5d1f6bc27b949b"}}}}}}
|
||||||
27
genera_lingue.dart
Normal file
27
genera_lingue.dart
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
import 'dart:io';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
void main() async {
|
||||||
|
final dir = Directory('lib/l10n');
|
||||||
|
if (!await dir.exists()) await dir.create(recursive: true);
|
||||||
|
|
||||||
|
final Map<String, Map<String, String>> translations = {
|
||||||
|
'it': {"appTitle": "TetraQ", "welcomeTitle": "BENVENUTO IN TETRAQ!", "nameHint": "NOME", "saveAndPlay": "SALVA E GIOCA", "onlineTitle": "ONLINE", "onlineSub": "Sfida il mondo", "cpuTitle": "VS CPU", "cpuSub": "Allenati con l'IA", "localTitle": "LOCALE", "localSub": "Stesso schermo", "leaderboardTitle": "CLASSIFICA", "questsTitle": "SFIDE", "themesTitle": "TEMI", "tutorialTitle": "TUTORIAL", "startGame": "AVVIA PARTITA", "createMatch": "CREA PARTITA", "joinMatch": "UNISCITI", "gameOver": "FINE PARTITA", "mainMenu": "TORNA AL MENU", "exit": "ESCI"},
|
||||||
|
'en': {"appTitle": "TetraQ", "welcomeTitle": "WELCOME TO TETRAQ!", "nameHint": "NAME", "saveAndPlay": "SAVE & PLAY", "onlineTitle": "ONLINE", "onlineSub": "Challenge the world", "cpuTitle": "VS CPU", "cpuSub": "Train with AI", "localTitle": "LOCAL", "localSub": "Same screen", "leaderboardTitle": "LEADERBOARD", "questsTitle": "QUESTS", "themesTitle": "THEMES", "tutorialTitle": "TUTORIAL", "startGame": "START GAME", "createMatch": "CREATE MATCH", "joinMatch": "JOIN", "gameOver": "GAME OVER", "mainMenu": "BACK TO MENU", "exit": "EXIT"},
|
||||||
|
'es': {"appTitle": "TetraQ", "welcomeTitle": "¡BIENVENIDO A TETRAQ!", "nameHint": "NOMBRE", "saveAndPlay": "GUARDAR Y JUGAR", "onlineTitle": "ONLINE", "onlineSub": "Desafía al mundo", "cpuTitle": "VS CPU", "cpuSub": "Entrena con IA", "localTitle": "LOCAL", "localSub": "Misma pantalla", "leaderboardTitle": "RANKING", "questsTitle": "MISIONES", "themesTitle": "TEMAS", "tutorialTitle": "TUTORIAL", "startGame": "INICIAR JUEGO", "createMatch": "CREAR PARTIDA", "joinMatch": "UNIRSE", "gameOver": "FIN DEL JUEGO", "mainMenu": "VOLVER AL MENÚ", "exit": "SALIR"},
|
||||||
|
'fr': {"appTitle": "TetraQ", "welcomeTitle": "BIENVENUE DANS TETRAQ !", "nameHint": "NOM", "saveAndPlay": "SAUVEGARDER ET JOUER", "onlineTitle": "EN LIGNE", "onlineSub": "Défiez le monde", "cpuTitle": "VS CPU", "cpuSub": "Entraînez avec l'IA", "localTitle": "LOCAL", "localSub": "Même écran", "leaderboardTitle": "CLASSEMENT", "questsTitle": "QUÊTES", "themesTitle": "THÈMES", "tutorialTitle": "TUTORIEL", "startGame": "JOUER", "createMatch": "CRÉER UN MATCH", "joinMatch": "REJOINDRE", "gameOver": "FIN DE PARTIE", "mainMenu": "RETOUR AU MENU", "exit": "QUITTER"},
|
||||||
|
'de': {"appTitle": "TetraQ", "welcomeTitle": "WILLKOMMEN BEI TETRAQ!", "nameHint": "NAME", "saveAndPlay": "SPEICHERN & SPIELEN", "onlineTitle": "ONLINE", "onlineSub": "Fordere die Welt heraus", "cpuTitle": "VS CPU", "cpuSub": "Trainiere mit KI", "localTitle": "LOKAL", "localSub": "Gleicher Bildschirm", "leaderboardTitle": "RANGLISTE", "questsTitle": "MISSIONEN", "themesTitle": "THEMEN", "tutorialTitle": "TUTORIAL", "startGame": "SPIEL STARTEN", "createMatch": "SPIEL ERSTELLEN", "joinMatch": "BEITRETEN", "gameOver": "SPIELENDE", "mainMenu": "ZURÜCK ZUM MENÜ", "exit": "BEENDEN"},
|
||||||
|
'pt': {"appTitle": "TetraQ", "welcomeTitle": "BEM-VINDO AO TETRAQ!", "nameHint": "NOME", "saveAndPlay": "SALVAR E JOGAR", "onlineTitle": "ONLINE", "onlineSub": "Desafie o mundo", "cpuTitle": "VS CPU", "cpuSub": "Treine com a IA", "localTitle": "LOCAL", "localSub": "Mesma tela", "leaderboardTitle": "CLASSIFICAÇÃO", "questsTitle": "DESAFIOS", "themesTitle": "TEMAS", "tutorialTitle": "TUTORIAL", "startGame": "INICIAR JOGO", "createMatch": "CRIAR PARTIDA", "joinMatch": "ENTRAR", "gameOver": "FIM DE JOGO", "mainMenu": "VOLTAR AO MENU", "exit": "SAIR"},
|
||||||
|
'ru': {"appTitle": "TetraQ", "welcomeTitle": "ДОБРО ПОЖАЛОВАТЬ В TETRAQ!", "nameHint": "ИМЯ", "saveAndPlay": "СОХРАНИТЬ И ИГРАТЬ", "onlineTitle": "ОНЛАЙН", "onlineSub": "Брось вызов миру", "cpuTitle": "VS ИИ", "cpuSub": "Тренировка с ИИ", "localTitle": "ЛОКАЛЬНО", "localSub": "Один экран", "leaderboardTitle": "РЕЙТИНГ", "questsTitle": "ЗАДАНИЯ", "themesTitle": "ТЕМЫ", "tutorialTitle": "ОБУЧЕНИЕ", "startGame": "НАЧАТЬ ИГРУ", "createMatch": "СОЗДАТЬ ИГРУ", "joinMatch": "ПРИСОЕДИНИТЬСЯ", "gameOver": "ИГРА ОКОНЧЕНА", "mainMenu": "В ГЛАВНОЕ МЕНЮ", "exit": "ВЫХОД"},
|
||||||
|
'zh': {"appTitle": "TetraQ", "welcomeTitle": "欢迎来到 TETRAQ!", "nameHint": "名字", "saveAndPlay": "保存并开始", "onlineTitle": "在线匹配", "onlineSub": "挑战世界", "cpuTitle": "人机对战", "cpuSub": "与AI训练", "localTitle": "本地游戏", "localSub": "同屏对战", "leaderboardTitle": "排行榜", "questsTitle": "任务", "themesTitle": "主题", "tutorialTitle": "教程", "startGame": "开始游戏", "createMatch": "创建比赛", "joinMatch": "加入", "gameOver": "游戏结束", "mainMenu": "返回主菜单", "exit": "退出"}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var lang in translations.keys) {
|
||||||
|
final file = File('lib/l10n/app_$lang.arb');
|
||||||
|
final Map<String, dynamic> finalContent = {"@@locale": lang, ...translations[lang]!};
|
||||||
|
await file.writeAsString(JsonEncoder.withIndent(' ').convert(finalContent));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Crea anche il file di configurazione
|
||||||
|
await File('l10n.yaml').writeAsString("arb-dir: lib/l10n\ntemplate-arb-file: app_it.arb\noutput-localization-file: app_localizations.dart\n");
|
||||||
|
}
|
||||||
|
|
@ -483,7 +483,7 @@
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.2;
|
MARKETING_VERSION = 1.0.2;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.sanza.tetraq;
|
PRODUCT_BUNDLE_IDENTIFIER = com.amastra.tetraq;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
|
@ -500,7 +500,7 @@
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.sanza.tetraq.RunnerTests;
|
PRODUCT_BUNDLE_IDENTIFIER = com.amastra.tetraq.RunnerTests;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
|
@ -518,7 +518,7 @@
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.sanza.tetraq.RunnerTests;
|
PRODUCT_BUNDLE_IDENTIFIER = com.amastra.tetraq.RunnerTests;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
||||||
|
|
@ -534,7 +534,7 @@
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.sanza.tetraq.RunnerTests;
|
PRODUCT_BUNDLE_IDENTIFIER = com.amastra.tetraq.RunnerTests;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
||||||
|
|
@ -668,7 +668,7 @@
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.2;
|
MARKETING_VERSION = 1.0.2;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.sanza.tetraq;
|
PRODUCT_BUNDLE_IDENTIFIER = com.amastra.tetraq;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
|
@ -693,7 +693,7 @@
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.2;
|
MARKETING_VERSION = 1.0.2;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.sanza.tetraq;
|
PRODUCT_BUNDLE_IDENTIFIER = com.amastra.tetraq;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
<key>PLIST_VERSION</key>
|
<key>PLIST_VERSION</key>
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
<key>BUNDLE_ID</key>
|
<key>BUNDLE_ID</key>
|
||||||
<string>com.sanza.tetraq</string>
|
<string>com.amastra.tetraq</string>
|
||||||
<key>PROJECT_ID</key>
|
<key>PROJECT_ID</key>
|
||||||
<string>tetraq-32a4a</string>
|
<string>tetraq-32a4a</string>
|
||||||
<key>STORAGE_BUCKET</key>
|
<key>STORAGE_BUCKET</key>
|
||||||
|
|
@ -25,6 +25,6 @@
|
||||||
<key>IS_SIGNIN_ENABLED</key>
|
<key>IS_SIGNIN_ENABLED</key>
|
||||||
<true></true>
|
<true></true>
|
||||||
<key>GOOGLE_APP_ID</key>
|
<key>GOOGLE_APP_ID</key>
|
||||||
<string>1:705460445314:ios:da11cbca5d1f6bc27b949b</string>
|
<string>1:705460445314:ios:54d64cb7592954327b949b</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
4
l10n.yaml
Normal file
4
l10n.yaml
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
arb-dir: lib/l10n
|
||||||
|
template-arb-file: app_it.arb
|
||||||
|
output-localization-file: app_localizations.dart
|
||||||
|
output-dir: lib/l10n
|
||||||
BIN
lib/.DS_Store
vendored
BIN
lib/.DS_Store
vendored
Binary file not shown.
|
|
@ -48,7 +48,7 @@ class DefaultFirebaseOptions {
|
||||||
|
|
||||||
static const FirebaseOptions android = FirebaseOptions(
|
static const FirebaseOptions android = FirebaseOptions(
|
||||||
apiKey: 'AIzaSyBsXO595xVITDPrRnXrW8HPQLOe7Rz4Gg4',
|
apiKey: 'AIzaSyBsXO595xVITDPrRnXrW8HPQLOe7Rz4Gg4',
|
||||||
appId: '1:705460445314:android:4d35fef29cfd63727b949b',
|
appId: '1:705460445314:android:ceac21bb06b7a9f07b949b',
|
||||||
messagingSenderId: '705460445314',
|
messagingSenderId: '705460445314',
|
||||||
projectId: 'tetraq-32a4a',
|
projectId: 'tetraq-32a4a',
|
||||||
storageBucket: 'tetraq-32a4a.firebasestorage.app',
|
storageBucket: 'tetraq-32a4a.firebasestorage.app',
|
||||||
|
|
@ -56,11 +56,11 @@ class DefaultFirebaseOptions {
|
||||||
|
|
||||||
static const FirebaseOptions ios = FirebaseOptions(
|
static const FirebaseOptions ios = FirebaseOptions(
|
||||||
apiKey: 'AIzaSyB77j18Jgeb9gBAEwp-uyOQvr4m-RJ_rAE',
|
apiKey: 'AIzaSyB77j18Jgeb9gBAEwp-uyOQvr4m-RJ_rAE',
|
||||||
appId: '1:705460445314:ios:da11cbca5d1f6bc27b949b',
|
appId: '1:705460445314:ios:54d64cb7592954327b949b',
|
||||||
messagingSenderId: '705460445314',
|
messagingSenderId: '705460445314',
|
||||||
projectId: 'tetraq-32a4a',
|
projectId: 'tetraq-32a4a',
|
||||||
storageBucket: 'tetraq-32a4a.firebasestorage.app',
|
storageBucket: 'tetraq-32a4a.firebasestorage.app',
|
||||||
iosBundleId: 'com.sanza.tetraq',
|
iosBundleId: 'com.amastra.tetraq',
|
||||||
);
|
);
|
||||||
|
|
||||||
static const FirebaseOptions macos = FirebaseOptions(
|
static const FirebaseOptions macos = FirebaseOptions(
|
||||||
|
|
@ -71,4 +71,5 @@ class DefaultFirebaseOptions {
|
||||||
storageBucket: 'tetraq-32a4a.firebasestorage.app',
|
storageBucket: 'tetraq-32a4a.firebasestorage.app',
|
||||||
iosBundleId: 'com.sanza.tetraq',
|
iosBundleId: 'com.sanza.tetraq',
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
23
lib/l10n/app_de.arb
Normal file
23
lib/l10n/app_de.arb
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"@@locale": "de",
|
||||||
|
"appTitle": "TetraQ",
|
||||||
|
"welcomeTitle": "WILLKOMMEN BEI TETRAQ!",
|
||||||
|
"nameHint": "NAME",
|
||||||
|
"saveAndPlay": "SPEICHERN & SPIELEN",
|
||||||
|
"onlineTitle": "ONLINE",
|
||||||
|
"onlineSub": "Fordere die Welt heraus",
|
||||||
|
"cpuTitle": "VS CPU",
|
||||||
|
"cpuSub": "Trainiere mit KI",
|
||||||
|
"localTitle": "LOKAL",
|
||||||
|
"localSub": "Gleicher Bildschirm",
|
||||||
|
"leaderboardTitle": "RANGLISTE",
|
||||||
|
"questsTitle": "MISSIONEN",
|
||||||
|
"themesTitle": "THEMEN",
|
||||||
|
"tutorialTitle": "TUTORIAL",
|
||||||
|
"startGame": "SPIEL STARTEN",
|
||||||
|
"createMatch": "SPIEL ERSTELLEN",
|
||||||
|
"joinMatch": "BEITRETEN",
|
||||||
|
"gameOver": "SPIELENDE",
|
||||||
|
"mainMenu": "ZURÜCK ZUM MENÜ",
|
||||||
|
"exit": "BEENDEN"
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,23 @@
|
||||||
{
|
{
|
||||||
|
"@@locale": "en",
|
||||||
"appTitle": "TetraQ",
|
"appTitle": "TetraQ",
|
||||||
"playLocal": "PASS & PLAY (Local)"
|
"welcomeTitle": "WELCOME TO TETRAQ!",
|
||||||
|
"nameHint": "NAME",
|
||||||
|
"saveAndPlay": "SAVE & PLAY",
|
||||||
|
"onlineTitle": "ONLINE",
|
||||||
|
"onlineSub": "Challenge the world",
|
||||||
|
"cpuTitle": "VS CPU",
|
||||||
|
"cpuSub": "Train with AI",
|
||||||
|
"localTitle": "LOCAL",
|
||||||
|
"localSub": "Same screen",
|
||||||
|
"leaderboardTitle": "LEADERBOARD",
|
||||||
|
"questsTitle": "QUESTS",
|
||||||
|
"themesTitle": "THEMES",
|
||||||
|
"tutorialTitle": "TUTORIAL",
|
||||||
|
"startGame": "START GAME",
|
||||||
|
"createMatch": "CREATE MATCH",
|
||||||
|
"joinMatch": "JOIN",
|
||||||
|
"gameOver": "GAME OVER",
|
||||||
|
"mainMenu": "BACK TO MENU",
|
||||||
|
"exit": "EXIT"
|
||||||
}
|
}
|
||||||
23
lib/l10n/app_es.arb
Normal file
23
lib/l10n/app_es.arb
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"@@locale": "es",
|
||||||
|
"appTitle": "TetraQ",
|
||||||
|
"welcomeTitle": "¡BIENVENIDO A TETRAQ!",
|
||||||
|
"nameHint": "NOMBRE",
|
||||||
|
"saveAndPlay": "GUARDAR Y JUGAR",
|
||||||
|
"onlineTitle": "ONLINE",
|
||||||
|
"onlineSub": "Desafía al mundo",
|
||||||
|
"cpuTitle": "VS CPU",
|
||||||
|
"cpuSub": "Entrena con IA",
|
||||||
|
"localTitle": "LOCAL",
|
||||||
|
"localSub": "Misma pantalla",
|
||||||
|
"leaderboardTitle": "RANKING",
|
||||||
|
"questsTitle": "MISIONES",
|
||||||
|
"themesTitle": "TEMAS",
|
||||||
|
"tutorialTitle": "TUTORIAL",
|
||||||
|
"startGame": "INICIAR JUEGO",
|
||||||
|
"createMatch": "CREAR PARTIDA",
|
||||||
|
"joinMatch": "UNIRSE",
|
||||||
|
"gameOver": "FIN DEL JUEGO",
|
||||||
|
"mainMenu": "VOLVER AL MENÚ",
|
||||||
|
"exit": "SALIR"
|
||||||
|
}
|
||||||
23
lib/l10n/app_fr.arb
Normal file
23
lib/l10n/app_fr.arb
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"@@locale": "fr",
|
||||||
|
"appTitle": "TetraQ",
|
||||||
|
"welcomeTitle": "BIENVENUE DANS TETRAQ !",
|
||||||
|
"nameHint": "NOM",
|
||||||
|
"saveAndPlay": "SAUVEGARDER ET JOUER",
|
||||||
|
"onlineTitle": "EN LIGNE",
|
||||||
|
"onlineSub": "Défiez le monde",
|
||||||
|
"cpuTitle": "VS CPU",
|
||||||
|
"cpuSub": "Entraînez avec l'IA",
|
||||||
|
"localTitle": "LOCAL",
|
||||||
|
"localSub": "Même écran",
|
||||||
|
"leaderboardTitle": "CLASSEMENT",
|
||||||
|
"questsTitle": "QUÊTES",
|
||||||
|
"themesTitle": "THÈMES",
|
||||||
|
"tutorialTitle": "TUTORIEL",
|
||||||
|
"startGame": "JOUER",
|
||||||
|
"createMatch": "CRÉER UN MATCH",
|
||||||
|
"joinMatch": "REJOINDRE",
|
||||||
|
"gameOver": "FIN DE PARTIE",
|
||||||
|
"mainMenu": "RETOUR AU MENU",
|
||||||
|
"exit": "QUITTER"
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,23 @@
|
||||||
{
|
{
|
||||||
|
"@@locale": "it",
|
||||||
"appTitle": "TetraQ",
|
"appTitle": "TetraQ",
|
||||||
"playLocal": "PASS & PLAY (Locale)"
|
"welcomeTitle": "BENVENUTO IN TETRAQ!",
|
||||||
|
"nameHint": "NOME",
|
||||||
|
"saveAndPlay": "SALVA E GIOCA",
|
||||||
|
"onlineTitle": "ONLINE",
|
||||||
|
"onlineSub": "Sfida il mondo",
|
||||||
|
"cpuTitle": "VS CPU",
|
||||||
|
"cpuSub": "Allenati con l'IA",
|
||||||
|
"localTitle": "LOCALE",
|
||||||
|
"localSub": "Stesso schermo",
|
||||||
|
"leaderboardTitle": "CLASSIFICA",
|
||||||
|
"questsTitle": "SFIDE",
|
||||||
|
"themesTitle": "TEMI",
|
||||||
|
"tutorialTitle": "TUTORIAL",
|
||||||
|
"startGame": "AVVIA PARTITA",
|
||||||
|
"createMatch": "CREA PARTITA",
|
||||||
|
"joinMatch": "UNISCITI",
|
||||||
|
"gameOver": "FINE PARTITA",
|
||||||
|
"mainMenu": "TORNA AL MENU",
|
||||||
|
"exit": "ESCI"
|
||||||
}
|
}
|
||||||
286
lib/l10n/app_localizations.dart
Normal file
286
lib/l10n/app_localizations.dart
Normal file
|
|
@ -0,0 +1,286 @@
|
||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
|
import 'package:intl/intl.dart' as intl;
|
||||||
|
|
||||||
|
import 'app_localizations_de.dart';
|
||||||
|
import 'app_localizations_en.dart';
|
||||||
|
import 'app_localizations_es.dart';
|
||||||
|
import 'app_localizations_fr.dart';
|
||||||
|
import 'app_localizations_it.dart';
|
||||||
|
import 'app_localizations_pt.dart';
|
||||||
|
import 'app_localizations_ru.dart';
|
||||||
|
import 'app_localizations_zh.dart';
|
||||||
|
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
|
||||||
|
/// Callers can lookup localized strings with an instance of AppLocalizations
|
||||||
|
/// returned by `AppLocalizations.of(context)`.
|
||||||
|
///
|
||||||
|
/// Applications need to include `AppLocalizations.delegate()` in their app's
|
||||||
|
/// `localizationDelegates` list, and the locales they support in the app's
|
||||||
|
/// `supportedLocales` list. For example:
|
||||||
|
///
|
||||||
|
/// ```dart
|
||||||
|
/// import 'l10n/app_localizations.dart';
|
||||||
|
///
|
||||||
|
/// return MaterialApp(
|
||||||
|
/// localizationsDelegates: AppLocalizations.localizationsDelegates,
|
||||||
|
/// supportedLocales: AppLocalizations.supportedLocales,
|
||||||
|
/// home: MyApplicationHome(),
|
||||||
|
/// );
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// ## Update pubspec.yaml
|
||||||
|
///
|
||||||
|
/// Please make sure to update your pubspec.yaml to include the following
|
||||||
|
/// packages:
|
||||||
|
///
|
||||||
|
/// ```yaml
|
||||||
|
/// dependencies:
|
||||||
|
/// # Internationalization support.
|
||||||
|
/// flutter_localizations:
|
||||||
|
/// sdk: flutter
|
||||||
|
/// intl: any # Use the pinned version from flutter_localizations
|
||||||
|
///
|
||||||
|
/// # Rest of dependencies
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// ## iOS Applications
|
||||||
|
///
|
||||||
|
/// iOS applications define key application metadata, including supported
|
||||||
|
/// locales, in an Info.plist file that is built into the application bundle.
|
||||||
|
/// To configure the locales supported by your app, you’ll need to edit this
|
||||||
|
/// file.
|
||||||
|
///
|
||||||
|
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
|
||||||
|
/// Then, in the Project Navigator, open the Info.plist file under the Runner
|
||||||
|
/// project’s Runner folder.
|
||||||
|
///
|
||||||
|
/// Next, select the Information Property List item, select Add Item from the
|
||||||
|
/// Editor menu, then select Localizations from the pop-up menu.
|
||||||
|
///
|
||||||
|
/// Select and expand the newly-created Localizations item then, for each
|
||||||
|
/// locale your application supports, add a new item and select the locale
|
||||||
|
/// you wish to add from the pop-up menu in the Value field. This list should
|
||||||
|
/// be consistent with the languages listed in the AppLocalizations.supportedLocales
|
||||||
|
/// property.
|
||||||
|
abstract class AppLocalizations {
|
||||||
|
AppLocalizations(String locale)
|
||||||
|
: localeName = intl.Intl.canonicalizedLocale(locale.toString());
|
||||||
|
|
||||||
|
final String localeName;
|
||||||
|
|
||||||
|
static AppLocalizations? of(BuildContext context) {
|
||||||
|
return Localizations.of<AppLocalizations>(context, AppLocalizations);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const LocalizationsDelegate<AppLocalizations> delegate =
|
||||||
|
_AppLocalizationsDelegate();
|
||||||
|
|
||||||
|
/// A list of this localizations delegate along with the default localizations
|
||||||
|
/// delegates.
|
||||||
|
///
|
||||||
|
/// Returns a list of localizations delegates containing this delegate along with
|
||||||
|
/// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
|
||||||
|
/// and GlobalWidgetsLocalizations.delegate.
|
||||||
|
///
|
||||||
|
/// Additional delegates can be added by appending to this list in
|
||||||
|
/// MaterialApp. This list does not have to be used at all if a custom list
|
||||||
|
/// of delegates is preferred or required.
|
||||||
|
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
|
||||||
|
<LocalizationsDelegate<dynamic>>[
|
||||||
|
delegate,
|
||||||
|
GlobalMaterialLocalizations.delegate,
|
||||||
|
GlobalCupertinoLocalizations.delegate,
|
||||||
|
GlobalWidgetsLocalizations.delegate,
|
||||||
|
];
|
||||||
|
|
||||||
|
/// A list of this localizations delegate's supported locales.
|
||||||
|
static const List<Locale> supportedLocales = <Locale>[
|
||||||
|
Locale('de'),
|
||||||
|
Locale('en'),
|
||||||
|
Locale('es'),
|
||||||
|
Locale('fr'),
|
||||||
|
Locale('it'),
|
||||||
|
Locale('pt'),
|
||||||
|
Locale('ru'),
|
||||||
|
Locale('zh'),
|
||||||
|
];
|
||||||
|
|
||||||
|
/// No description provided for @appTitle.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'TetraQ'**
|
||||||
|
String get appTitle;
|
||||||
|
|
||||||
|
/// No description provided for @welcomeTitle.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'BENVENUTO IN TETRAQ!'**
|
||||||
|
String get welcomeTitle;
|
||||||
|
|
||||||
|
/// No description provided for @nameHint.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'NOME'**
|
||||||
|
String get nameHint;
|
||||||
|
|
||||||
|
/// No description provided for @saveAndPlay.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'SALVA E GIOCA'**
|
||||||
|
String get saveAndPlay;
|
||||||
|
|
||||||
|
/// No description provided for @onlineTitle.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'ONLINE'**
|
||||||
|
String get onlineTitle;
|
||||||
|
|
||||||
|
/// No description provided for @onlineSub.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'Sfida il mondo'**
|
||||||
|
String get onlineSub;
|
||||||
|
|
||||||
|
/// No description provided for @cpuTitle.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'VS CPU'**
|
||||||
|
String get cpuTitle;
|
||||||
|
|
||||||
|
/// No description provided for @cpuSub.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'Allenati con l\'IA'**
|
||||||
|
String get cpuSub;
|
||||||
|
|
||||||
|
/// No description provided for @localTitle.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'LOCALE'**
|
||||||
|
String get localTitle;
|
||||||
|
|
||||||
|
/// No description provided for @localSub.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'Stesso schermo'**
|
||||||
|
String get localSub;
|
||||||
|
|
||||||
|
/// No description provided for @leaderboardTitle.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'CLASSIFICA'**
|
||||||
|
String get leaderboardTitle;
|
||||||
|
|
||||||
|
/// No description provided for @questsTitle.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'SFIDE'**
|
||||||
|
String get questsTitle;
|
||||||
|
|
||||||
|
/// No description provided for @themesTitle.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'TEMI'**
|
||||||
|
String get themesTitle;
|
||||||
|
|
||||||
|
/// No description provided for @tutorialTitle.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'TUTORIAL'**
|
||||||
|
String get tutorialTitle;
|
||||||
|
|
||||||
|
/// No description provided for @startGame.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'AVVIA PARTITA'**
|
||||||
|
String get startGame;
|
||||||
|
|
||||||
|
/// No description provided for @createMatch.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'CREA PARTITA'**
|
||||||
|
String get createMatch;
|
||||||
|
|
||||||
|
/// No description provided for @joinMatch.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'UNISCITI'**
|
||||||
|
String get joinMatch;
|
||||||
|
|
||||||
|
/// No description provided for @gameOver.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'FINE PARTITA'**
|
||||||
|
String get gameOver;
|
||||||
|
|
||||||
|
/// No description provided for @mainMenu.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'TORNA AL MENU'**
|
||||||
|
String get mainMenu;
|
||||||
|
|
||||||
|
/// No description provided for @exit.
|
||||||
|
///
|
||||||
|
/// In it, this message translates to:
|
||||||
|
/// **'ESCI'**
|
||||||
|
String get exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AppLocalizationsDelegate
|
||||||
|
extends LocalizationsDelegate<AppLocalizations> {
|
||||||
|
const _AppLocalizationsDelegate();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<AppLocalizations> load(Locale locale) {
|
||||||
|
return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool isSupported(Locale locale) => <String>[
|
||||||
|
'de',
|
||||||
|
'en',
|
||||||
|
'es',
|
||||||
|
'fr',
|
||||||
|
'it',
|
||||||
|
'pt',
|
||||||
|
'ru',
|
||||||
|
'zh',
|
||||||
|
].contains(locale.languageCode);
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool shouldReload(_AppLocalizationsDelegate old) => false;
|
||||||
|
}
|
||||||
|
|
||||||
|
AppLocalizations lookupAppLocalizations(Locale locale) {
|
||||||
|
// Lookup logic when only language code is specified.
|
||||||
|
switch (locale.languageCode) {
|
||||||
|
case 'de':
|
||||||
|
return AppLocalizationsDe();
|
||||||
|
case 'en':
|
||||||
|
return AppLocalizationsEn();
|
||||||
|
case 'es':
|
||||||
|
return AppLocalizationsEs();
|
||||||
|
case 'fr':
|
||||||
|
return AppLocalizationsFr();
|
||||||
|
case 'it':
|
||||||
|
return AppLocalizationsIt();
|
||||||
|
case 'pt':
|
||||||
|
return AppLocalizationsPt();
|
||||||
|
case 'ru':
|
||||||
|
return AppLocalizationsRu();
|
||||||
|
case 'zh':
|
||||||
|
return AppLocalizationsZh();
|
||||||
|
}
|
||||||
|
|
||||||
|
throw FlutterError(
|
||||||
|
'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
|
||||||
|
'an issue with the localizations generation tool. Please file an issue '
|
||||||
|
'on GitHub with a reproducible sample app and the gen-l10n configuration '
|
||||||
|
'that was used.',
|
||||||
|
);
|
||||||
|
}
|
||||||
70
lib/l10n/app_localizations_de.dart
Normal file
70
lib/l10n/app_localizations_de.dart
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
// ignore: unused_import
|
||||||
|
import 'package:intl/intl.dart' as intl;
|
||||||
|
import 'app_localizations.dart';
|
||||||
|
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
|
||||||
|
/// The translations for German (`de`).
|
||||||
|
class AppLocalizationsDe extends AppLocalizations {
|
||||||
|
AppLocalizationsDe([String locale = 'de']) : super(locale);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get appTitle => 'TetraQ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get welcomeTitle => 'WILLKOMMEN BEI TETRAQ!';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get nameHint => 'NAME';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get saveAndPlay => 'SPEICHERN & SPIELEN';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineTitle => 'ONLINE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineSub => 'Fordere die Welt heraus';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuTitle => 'VS CPU';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuSub => 'Trainiere mit KI';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localTitle => 'LOKAL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localSub => 'Gleicher Bildschirm';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get leaderboardTitle => 'RANGLISTE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get questsTitle => 'MISSIONEN';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get themesTitle => 'THEMEN';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get tutorialTitle => 'TUTORIAL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get startGame => 'SPIEL STARTEN';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get createMatch => 'SPIEL ERSTELLEN';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get joinMatch => 'BEITRETEN';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get gameOver => 'SPIELENDE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get mainMenu => 'ZURÜCK ZUM MENÜ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get exit => 'BEENDEN';
|
||||||
|
}
|
||||||
70
lib/l10n/app_localizations_en.dart
Normal file
70
lib/l10n/app_localizations_en.dart
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
// ignore: unused_import
|
||||||
|
import 'package:intl/intl.dart' as intl;
|
||||||
|
import 'app_localizations.dart';
|
||||||
|
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
|
||||||
|
/// The translations for English (`en`).
|
||||||
|
class AppLocalizationsEn extends AppLocalizations {
|
||||||
|
AppLocalizationsEn([String locale = 'en']) : super(locale);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get appTitle => 'TetraQ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get welcomeTitle => 'WELCOME TO TETRAQ!';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get nameHint => 'NAME';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get saveAndPlay => 'SAVE & PLAY';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineTitle => 'ONLINE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineSub => 'Challenge the world';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuTitle => 'VS CPU';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuSub => 'Train with AI';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localTitle => 'LOCAL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localSub => 'Same screen';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get leaderboardTitle => 'LEADERBOARD';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get questsTitle => 'QUESTS';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get themesTitle => 'THEMES';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get tutorialTitle => 'TUTORIAL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get startGame => 'START GAME';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get createMatch => 'CREATE MATCH';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get joinMatch => 'JOIN';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get gameOver => 'GAME OVER';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get mainMenu => 'BACK TO MENU';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get exit => 'EXIT';
|
||||||
|
}
|
||||||
70
lib/l10n/app_localizations_es.dart
Normal file
70
lib/l10n/app_localizations_es.dart
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
// ignore: unused_import
|
||||||
|
import 'package:intl/intl.dart' as intl;
|
||||||
|
import 'app_localizations.dart';
|
||||||
|
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
|
||||||
|
/// The translations for Spanish Castilian (`es`).
|
||||||
|
class AppLocalizationsEs extends AppLocalizations {
|
||||||
|
AppLocalizationsEs([String locale = 'es']) : super(locale);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get appTitle => 'TetraQ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get welcomeTitle => '¡BIENVENIDO A TETRAQ!';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get nameHint => 'NOMBRE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get saveAndPlay => 'GUARDAR Y JUGAR';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineTitle => 'ONLINE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineSub => 'Desafía al mundo';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuTitle => 'VS CPU';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuSub => 'Entrena con IA';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localTitle => 'LOCAL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localSub => 'Misma pantalla';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get leaderboardTitle => 'RANKING';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get questsTitle => 'MISIONES';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get themesTitle => 'TEMAS';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get tutorialTitle => 'TUTORIAL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get startGame => 'INICIAR JUEGO';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get createMatch => 'CREAR PARTIDA';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get joinMatch => 'UNIRSE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get gameOver => 'FIN DEL JUEGO';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get mainMenu => 'VOLVER AL MENÚ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get exit => 'SALIR';
|
||||||
|
}
|
||||||
70
lib/l10n/app_localizations_fr.dart
Normal file
70
lib/l10n/app_localizations_fr.dart
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
// ignore: unused_import
|
||||||
|
import 'package:intl/intl.dart' as intl;
|
||||||
|
import 'app_localizations.dart';
|
||||||
|
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
|
||||||
|
/// The translations for French (`fr`).
|
||||||
|
class AppLocalizationsFr extends AppLocalizations {
|
||||||
|
AppLocalizationsFr([String locale = 'fr']) : super(locale);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get appTitle => 'TetraQ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get welcomeTitle => 'BIENVENUE DANS TETRAQ !';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get nameHint => 'NOM';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get saveAndPlay => 'SAUVEGARDER ET JOUER';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineTitle => 'EN LIGNE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineSub => 'Défiez le monde';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuTitle => 'VS CPU';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuSub => 'Entraînez avec l\'IA';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localTitle => 'LOCAL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localSub => 'Même écran';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get leaderboardTitle => 'CLASSEMENT';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get questsTitle => 'QUÊTES';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get themesTitle => 'THÈMES';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get tutorialTitle => 'TUTORIEL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get startGame => 'JOUER';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get createMatch => 'CRÉER UN MATCH';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get joinMatch => 'REJOINDRE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get gameOver => 'FIN DE PARTIE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get mainMenu => 'RETOUR AU MENU';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get exit => 'QUITTER';
|
||||||
|
}
|
||||||
70
lib/l10n/app_localizations_it.dart
Normal file
70
lib/l10n/app_localizations_it.dart
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
// ignore: unused_import
|
||||||
|
import 'package:intl/intl.dart' as intl;
|
||||||
|
import 'app_localizations.dart';
|
||||||
|
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
|
||||||
|
/// The translations for Italian (`it`).
|
||||||
|
class AppLocalizationsIt extends AppLocalizations {
|
||||||
|
AppLocalizationsIt([String locale = 'it']) : super(locale);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get appTitle => 'TetraQ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get welcomeTitle => 'BENVENUTO IN TETRAQ!';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get nameHint => 'NOME';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get saveAndPlay => 'SALVA E GIOCA';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineTitle => 'ONLINE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineSub => 'Sfida il mondo';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuTitle => 'VS CPU';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuSub => 'Allenati con l\'IA';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localTitle => 'LOCALE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localSub => 'Stesso schermo';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get leaderboardTitle => 'CLASSIFICA';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get questsTitle => 'SFIDE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get themesTitle => 'TEMI';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get tutorialTitle => 'TUTORIAL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get startGame => 'AVVIA PARTITA';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get createMatch => 'CREA PARTITA';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get joinMatch => 'UNISCITI';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get gameOver => 'FINE PARTITA';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get mainMenu => 'TORNA AL MENU';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get exit => 'ESCI';
|
||||||
|
}
|
||||||
70
lib/l10n/app_localizations_pt.dart
Normal file
70
lib/l10n/app_localizations_pt.dart
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
// ignore: unused_import
|
||||||
|
import 'package:intl/intl.dart' as intl;
|
||||||
|
import 'app_localizations.dart';
|
||||||
|
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
|
||||||
|
/// The translations for Portuguese (`pt`).
|
||||||
|
class AppLocalizationsPt extends AppLocalizations {
|
||||||
|
AppLocalizationsPt([String locale = 'pt']) : super(locale);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get appTitle => 'TetraQ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get welcomeTitle => 'BEM-VINDO AO TETRAQ!';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get nameHint => 'NOME';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get saveAndPlay => 'SALVAR E JOGAR';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineTitle => 'ONLINE';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineSub => 'Desafie o mundo';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuTitle => 'VS CPU';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuSub => 'Treine com a IA';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localTitle => 'LOCAL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localSub => 'Mesma tela';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get leaderboardTitle => 'CLASSIFICAÇÃO';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get questsTitle => 'DESAFIOS';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get themesTitle => 'TEMAS';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get tutorialTitle => 'TUTORIAL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get startGame => 'INICIAR JOGO';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get createMatch => 'CRIAR PARTIDA';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get joinMatch => 'ENTRAR';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get gameOver => 'FIM DE JOGO';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get mainMenu => 'VOLTAR AO MENU';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get exit => 'SAIR';
|
||||||
|
}
|
||||||
70
lib/l10n/app_localizations_ru.dart
Normal file
70
lib/l10n/app_localizations_ru.dart
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
// ignore: unused_import
|
||||||
|
import 'package:intl/intl.dart' as intl;
|
||||||
|
import 'app_localizations.dart';
|
||||||
|
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
|
||||||
|
/// The translations for Russian (`ru`).
|
||||||
|
class AppLocalizationsRu extends AppLocalizations {
|
||||||
|
AppLocalizationsRu([String locale = 'ru']) : super(locale);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get appTitle => 'TetraQ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get welcomeTitle => 'ДОБРО ПОЖАЛОВАТЬ В TETRAQ!';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get nameHint => 'ИМЯ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get saveAndPlay => 'СОХРАНИТЬ И ИГРАТЬ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineTitle => 'ОНЛАЙН';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineSub => 'Брось вызов миру';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuTitle => 'VS ИИ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuSub => 'Тренировка с ИИ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localTitle => 'ЛОКАЛЬНО';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localSub => 'Один экран';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get leaderboardTitle => 'РЕЙТИНГ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get questsTitle => 'ЗАДАНИЯ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get themesTitle => 'ТЕМЫ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get tutorialTitle => 'ОБУЧЕНИЕ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get startGame => 'НАЧАТЬ ИГРУ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get createMatch => 'СОЗДАТЬ ИГРУ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get joinMatch => 'ПРИСОЕДИНИТЬСЯ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get gameOver => 'ИГРА ОКОНЧЕНА';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get mainMenu => 'В ГЛАВНОЕ МЕНЮ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get exit => 'ВЫХОД';
|
||||||
|
}
|
||||||
70
lib/l10n/app_localizations_zh.dart
Normal file
70
lib/l10n/app_localizations_zh.dart
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
// ignore: unused_import
|
||||||
|
import 'package:intl/intl.dart' as intl;
|
||||||
|
import 'app_localizations.dart';
|
||||||
|
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
|
||||||
|
/// The translations for Chinese (`zh`).
|
||||||
|
class AppLocalizationsZh extends AppLocalizations {
|
||||||
|
AppLocalizationsZh([String locale = 'zh']) : super(locale);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get appTitle => 'TetraQ';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get welcomeTitle => '欢迎来到 TETRAQ!';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get nameHint => '名字';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get saveAndPlay => '保存并开始';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineTitle => '在线匹配';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onlineSub => '挑战世界';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuTitle => '人机对战';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get cpuSub => '与AI训练';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localTitle => '本地游戏';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get localSub => '同屏对战';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get leaderboardTitle => '排行榜';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get questsTitle => '任务';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get themesTitle => '主题';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get tutorialTitle => '教程';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get startGame => '开始游戏';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get createMatch => '创建比赛';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get joinMatch => '加入';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get gameOver => '游戏结束';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get mainMenu => '返回主菜单';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get exit => '退出';
|
||||||
|
}
|
||||||
23
lib/l10n/app_pt.arb
Normal file
23
lib/l10n/app_pt.arb
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"@@locale": "pt",
|
||||||
|
"appTitle": "TetraQ",
|
||||||
|
"welcomeTitle": "BEM-VINDO AO TETRAQ!",
|
||||||
|
"nameHint": "NOME",
|
||||||
|
"saveAndPlay": "SALVAR E JOGAR",
|
||||||
|
"onlineTitle": "ONLINE",
|
||||||
|
"onlineSub": "Desafie o mundo",
|
||||||
|
"cpuTitle": "VS CPU",
|
||||||
|
"cpuSub": "Treine com a IA",
|
||||||
|
"localTitle": "LOCAL",
|
||||||
|
"localSub": "Mesma tela",
|
||||||
|
"leaderboardTitle": "CLASSIFICAÇÃO",
|
||||||
|
"questsTitle": "DESAFIOS",
|
||||||
|
"themesTitle": "TEMAS",
|
||||||
|
"tutorialTitle": "TUTORIAL",
|
||||||
|
"startGame": "INICIAR JOGO",
|
||||||
|
"createMatch": "CRIAR PARTIDA",
|
||||||
|
"joinMatch": "ENTRAR",
|
||||||
|
"gameOver": "FIM DE JOGO",
|
||||||
|
"mainMenu": "VOLTAR AO MENU",
|
||||||
|
"exit": "SAIR"
|
||||||
|
}
|
||||||
23
lib/l10n/app_ru.arb
Normal file
23
lib/l10n/app_ru.arb
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"@@locale": "ru",
|
||||||
|
"appTitle": "TetraQ",
|
||||||
|
"welcomeTitle": "ДОБРО ПОЖАЛОВАТЬ В TETRAQ!",
|
||||||
|
"nameHint": "ИМЯ",
|
||||||
|
"saveAndPlay": "СОХРАНИТЬ И ИГРАТЬ",
|
||||||
|
"onlineTitle": "ОНЛАЙН",
|
||||||
|
"onlineSub": "Брось вызов миру",
|
||||||
|
"cpuTitle": "VS ИИ",
|
||||||
|
"cpuSub": "Тренировка с ИИ",
|
||||||
|
"localTitle": "ЛОКАЛЬНО",
|
||||||
|
"localSub": "Один экран",
|
||||||
|
"leaderboardTitle": "РЕЙТИНГ",
|
||||||
|
"questsTitle": "ЗАДАНИЯ",
|
||||||
|
"themesTitle": "ТЕМЫ",
|
||||||
|
"tutorialTitle": "ОБУЧЕНИЕ",
|
||||||
|
"startGame": "НАЧАТЬ ИГРУ",
|
||||||
|
"createMatch": "СОЗДАТЬ ИГРУ",
|
||||||
|
"joinMatch": "ПРИСОЕДИНИТЬСЯ",
|
||||||
|
"gameOver": "ИГРА ОКОНЧЕНА",
|
||||||
|
"mainMenu": "В ГЛАВНОЕ МЕНЮ",
|
||||||
|
"exit": "ВЫХОД"
|
||||||
|
}
|
||||||
23
lib/l10n/app_zh.arb
Normal file
23
lib/l10n/app_zh.arb
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"@@locale": "zh",
|
||||||
|
"appTitle": "TetraQ",
|
||||||
|
"welcomeTitle": "欢迎来到 TETRAQ!",
|
||||||
|
"nameHint": "名字",
|
||||||
|
"saveAndPlay": "保存并开始",
|
||||||
|
"onlineTitle": "在线匹配",
|
||||||
|
"onlineSub": "挑战世界",
|
||||||
|
"cpuTitle": "人机对战",
|
||||||
|
"cpuSub": "与AI训练",
|
||||||
|
"localTitle": "本地游戏",
|
||||||
|
"localSub": "同屏对战",
|
||||||
|
"leaderboardTitle": "排行榜",
|
||||||
|
"questsTitle": "任务",
|
||||||
|
"themesTitle": "主题",
|
||||||
|
"tutorialTitle": "教程",
|
||||||
|
"startGame": "开始游戏",
|
||||||
|
"createMatch": "创建比赛",
|
||||||
|
"joinMatch": "加入",
|
||||||
|
"gameOver": "游戏结束",
|
||||||
|
"mainMenu": "返回主菜单",
|
||||||
|
"exit": "退出"
|
||||||
|
}
|
||||||
|
|
@ -3,45 +3,41 @@
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/foundation.dart'; // <-- AGGIUNTO PER kDebugMode
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'core/theme_manager.dart';
|
import 'core/theme_manager.dart';
|
||||||
import 'logic/game_controller.dart';
|
import 'logic/game_controller.dart';
|
||||||
import 'ui/home/home_screen.dart';
|
import 'ui/home/home_screen.dart';
|
||||||
import 'services/storage_service.dart';
|
import 'services/storage_service.dart';
|
||||||
import 'services/audio_service.dart'; // <-- NUOVO IMPORT PER L'AUDIO
|
import 'services/audio_service.dart';
|
||||||
import 'package:firebase_core/firebase_core.dart';
|
import 'package:firebase_core/firebase_core.dart';
|
||||||
import 'package:firebase_auth/firebase_auth.dart';
|
import 'package:firebase_auth/firebase_auth.dart';
|
||||||
import 'firebase_options.dart';
|
import 'firebase_options.dart';
|
||||||
import 'package:firebase_app_check/firebase_app_check.dart'; // <-- IMPORT APP CHECK
|
import 'package:firebase_app_check/firebase_app_check.dart';
|
||||||
|
|
||||||
|
// --- IMPORT PER IL SUPPORTO MULTILINGUA ---
|
||||||
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
|
import 'package:tetraq/l10n/app_localizations.dart';
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
// Assicuriamoci che i motori di Flutter siano pronti
|
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
// 1. Accendiamo Firebase!
|
|
||||||
await Firebase.initializeApp(
|
await Firebase.initializeApp(
|
||||||
options: DefaultFirebaseOptions.currentPlatform,
|
options: DefaultFirebaseOptions.currentPlatform,
|
||||||
);
|
);
|
||||||
|
|
||||||
// --- NUOVO: SCUDO APP CHECK ---
|
|
||||||
await FirebaseAppCheck.instance.activate(
|
await FirebaseAppCheck.instance.activate(
|
||||||
// Se stai programmando (Debug), usa una chiave finta. Se l'app è sugli Store, usa i veri sistemi di sicurezza Apple/Google.
|
|
||||||
androidProvider: kDebugMode ? AndroidProvider.debug : AndroidProvider.playIntegrity,
|
androidProvider: kDebugMode ? AndroidProvider.debug : AndroidProvider.playIntegrity,
|
||||||
appleProvider: kDebugMode ? AppleProvider.debug : AppleProvider.deviceCheck,
|
appleProvider: kDebugMode ? AppleProvider.debug : AppleProvider.deviceCheck,
|
||||||
);
|
);
|
||||||
|
|
||||||
// 2. Login Silenzioso (Crea la nostra "Identità Sicura" per Firebase)
|
|
||||||
try {
|
try {
|
||||||
await FirebaseAuth.instance.signInAnonymously();
|
await FirebaseAuth.instance.signInAnonymously();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
debugPrint("Errore Auth: $e");
|
debugPrint("Errore Auth: $e");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. Accendiamo la Memoria Locale!
|
|
||||||
await StorageService.instance.init();
|
await StorageService.instance.init();
|
||||||
|
|
||||||
// 4. Accendiamo la Radio! (Lettore Musicale)
|
|
||||||
await AudioService.instance.init();
|
await AudioService.instance.init();
|
||||||
|
|
||||||
runApp(
|
runApp(
|
||||||
|
|
@ -67,6 +63,14 @@ class TetraQApp extends StatelessWidget {
|
||||||
fontFamily: 'Roboto',
|
fontFamily: 'Roboto',
|
||||||
useMaterial3: true,
|
useMaterial3: true,
|
||||||
),
|
),
|
||||||
|
|
||||||
|
// --- BIVIO DELLE LINGUE ATTIVATO! ---
|
||||||
|
// Flutter si occuperà di caricare automaticamente tutte le lingue
|
||||||
|
// che hai generato tramite lo script.
|
||||||
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
||||||
|
supportedLocales: AppLocalizations.supportedLocales,
|
||||||
|
// ------------------------------------
|
||||||
|
|
||||||
home: const HomeScreen(),
|
home: const HomeScreen(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ import '../../services/storage_service.dart';
|
||||||
import '../multiplayer/lobby_screen.dart';
|
import '../multiplayer/lobby_screen.dart';
|
||||||
import 'history_screen.dart';
|
import 'history_screen.dart';
|
||||||
import 'package:firebase_auth/firebase_auth.dart';
|
import 'package:firebase_auth/firebase_auth.dart';
|
||||||
|
import 'package:tetraq/l10n/app_localizations.dart';
|
||||||
|
|
||||||
TextStyle _getTextStyle(AppThemeType themeType, TextStyle baseStyle) {
|
TextStyle _getTextStyle(AppThemeType themeType, TextStyle baseStyle) {
|
||||||
if (themeType == AppThemeType.doodle) {
|
if (themeType == AppThemeType.doodle) {
|
||||||
|
|
@ -429,6 +430,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
final theme = themeManager.currentColors;
|
final theme = themeManager.currentColors;
|
||||||
final themeType = themeManager.currentThemeType;
|
final themeType = themeManager.currentThemeType;
|
||||||
Color inkColor = const Color(0xFF111122);
|
Color inkColor = const Color(0xFF111122);
|
||||||
|
final loc = AppLocalizations.of(context)!;
|
||||||
|
|
||||||
Widget dialogContent = themeType == AppThemeType.doodle
|
Widget dialogContent = themeType == AppThemeType.doodle
|
||||||
? CustomPaint(
|
? CustomPaint(
|
||||||
|
|
@ -438,7 +440,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Text('BENVENUTO!', style: _getTextStyle(themeType, TextStyle(color: inkColor, fontWeight: FontWeight.w900, fontSize: 28, letterSpacing: 2.0)), textAlign: TextAlign.center),
|
Text(loc.welcomeTitle, style: _getTextStyle(themeType, TextStyle(color: inkColor, fontWeight: FontWeight.w900, fontSize: 28, letterSpacing: 2.0)), textAlign: TextAlign.center),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
Text('Scegli il tuo nome da battaglia', style: _getTextStyle(themeType, TextStyle(color: inkColor.withOpacity(0.8), fontSize: 18)), textAlign: TextAlign.center),
|
Text('Scegli il tuo nome da battaglia', style: _getTextStyle(themeType, TextStyle(color: inkColor.withOpacity(0.8), fontSize: 18)), textAlign: TextAlign.center),
|
||||||
const SizedBox(height: 30),
|
const SizedBox(height: 30),
|
||||||
|
|
@ -446,7 +448,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
controller: nameController, textCapitalization: TextCapitalization.characters, textAlign: TextAlign.center, maxLength: 5,
|
controller: nameController, textCapitalization: TextCapitalization.characters, textAlign: TextAlign.center, maxLength: 5,
|
||||||
style: _getTextStyle(themeType, TextStyle(color: inkColor, fontSize: 36, fontWeight: FontWeight.bold, letterSpacing: 8)),
|
style: _getTextStyle(themeType, TextStyle(color: inkColor, fontSize: 36, fontWeight: FontWeight.bold, letterSpacing: 8)),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: 'NOME', hintStyle: _getTextStyle(themeType, TextStyle(color: inkColor.withOpacity(0.3), letterSpacing: 4)),
|
hintText: loc.nameHint, hintStyle: _getTextStyle(themeType, TextStyle(color: inkColor.withOpacity(0.3), letterSpacing: 4)),
|
||||||
filled: false, counterText: "",
|
filled: false, counterText: "",
|
||||||
enabledBorder: UnderlineInputBorder(borderSide: BorderSide(color: inkColor, width: 3)),
|
enabledBorder: UnderlineInputBorder(borderSide: BorderSide(color: inkColor, width: 3)),
|
||||||
focusedBorder: UnderlineInputBorder(borderSide: BorderSide(color: Colors.red.shade200, width: 5)),
|
focusedBorder: UnderlineInputBorder(borderSide: BorderSide(color: Colors.red.shade200, width: 5)),
|
||||||
|
|
@ -467,7 +469,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
child: Container(
|
child: Container(
|
||||||
width: double.infinity, height: 60,
|
width: double.infinity, height: 60,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
child: Text('SALVA E GIOCA', style: _getTextStyle(themeType, TextStyle(color: inkColor, fontSize: 22, fontWeight: FontWeight.bold, letterSpacing: 1.5))),
|
child: Text(loc.saveAndPlay, style: _getTextStyle(themeType, TextStyle(color: inkColor, fontSize: 22, fontWeight: FontWeight.bold, letterSpacing: 1.5))),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -488,7 +490,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Text('BENVENUTO IN TETRAQ!', style: _getTextStyle(themeType, TextStyle(color: theme.text, fontWeight: FontWeight.w900, fontSize: 24, letterSpacing: 1.5)), textAlign: TextAlign.center),
|
Text(loc.welcomeTitle, style: _getTextStyle(themeType, TextStyle(color: theme.text, fontWeight: FontWeight.w900, fontSize: 24, letterSpacing: 1.5)), textAlign: TextAlign.center),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
Text('Scegli il tuo nome da battaglia per sfidare i tuoi amici online.', style: _getTextStyle(themeType, TextStyle(color: theme.text.withOpacity(0.8), fontSize: 16)), textAlign: TextAlign.center),
|
Text('Scegli il tuo nome da battaglia per sfidare i tuoi amici online.', style: _getTextStyle(themeType, TextStyle(color: theme.text.withOpacity(0.8), fontSize: 16)), textAlign: TextAlign.center),
|
||||||
const SizedBox(height: 40),
|
const SizedBox(height: 40),
|
||||||
|
|
@ -496,7 +498,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
controller: nameController, textCapitalization: TextCapitalization.characters, textAlign: TextAlign.center, maxLength: 5,
|
controller: nameController, textCapitalization: TextCapitalization.characters, textAlign: TextAlign.center, maxLength: 5,
|
||||||
style: _getTextStyle(themeType, TextStyle(color: theme.text, fontSize: 32, fontWeight: FontWeight.bold, letterSpacing: 8)),
|
style: _getTextStyle(themeType, TextStyle(color: theme.text, fontSize: 32, fontWeight: FontWeight.bold, letterSpacing: 8)),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: 'NOME', hintStyle: _getTextStyle(themeType, TextStyle(color: theme.text.withOpacity(0.3), letterSpacing: 4)),
|
hintText: loc.nameHint, hintStyle: _getTextStyle(themeType, TextStyle(color: theme.text.withOpacity(0.3), letterSpacing: 4)),
|
||||||
filled: true, fillColor: theme.text.withOpacity(0.05), counterText: "",
|
filled: true, fillColor: theme.text.withOpacity(0.05), counterText: "",
|
||||||
enabledBorder: OutlineInputBorder(borderSide: BorderSide(color: theme.gridLine.withOpacity(0.5), width: 2), borderRadius: BorderRadius.circular(15)),
|
enabledBorder: OutlineInputBorder(borderSide: BorderSide(color: theme.gridLine.withOpacity(0.5), width: 2), borderRadius: BorderRadius.circular(15)),
|
||||||
focusedBorder: OutlineInputBorder(borderSide: BorderSide(color: theme.playerBlue, width: 3), borderRadius: BorderRadius.circular(15)),
|
focusedBorder: OutlineInputBorder(borderSide: BorderSide(color: theme.playerBlue, width: 3), borderRadius: BorderRadius.circular(15)),
|
||||||
|
|
@ -515,7 +517,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: Text('SALVA E GIOCA', style: _getTextStyle(themeType, const TextStyle(fontSize: 18, fontWeight: FontWeight.bold, letterSpacing: 1.5))),
|
child: Text(loc.saveAndPlay, style: _getTextStyle(themeType, const TextStyle(fontSize: 18, fontWeight: FontWeight.bold, letterSpacing: 1.5))),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
@ -575,7 +577,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
Navigator.push(context, MaterialPageRoute(builder: (_) => LobbyScreen(initialRoomCode: roomCode)));
|
Navigator.push(context, MaterialPageRoute(builder: (_) => LobbyScreen(initialRoomCode: roomCode)));
|
||||||
},
|
},
|
||||||
child: Text("Unisciti", style: _getTextStyle(themeType, TextStyle(color: themeType == AppThemeType.doodle ? theme.text : Colors.white, fontWeight: FontWeight.bold))),
|
child: Text(AppLocalizations.of(context)!.joinMatch, style: _getTextStyle(themeType, TextStyle(color: themeType == AppThemeType.doodle ? theme.text : Colors.white, fontWeight: FontWeight.bold))),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
@ -588,6 +590,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
ArenaShape localShape = ArenaShape.classic;
|
ArenaShape localShape = ArenaShape.classic;
|
||||||
bool localTimeMode = true;
|
bool localTimeMode = true;
|
||||||
bool isChaosUnlocked = StorageService.instance.playerLevel >= 10;
|
bool isChaosUnlocked = StorageService.instance.playerLevel >= 10;
|
||||||
|
final loc = AppLocalizations.of(context)!;
|
||||||
|
|
||||||
showDialog(
|
showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
|
|
@ -612,7 +615,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Text(isVsCPU ? "SFIDA IA" : "MODALITÀ LOCALE", style: _getTextStyle(themeType, TextStyle(fontSize: 26, fontWeight: FontWeight.w900, color: inkColor, letterSpacing: 2))),
|
Text(isVsCPU ? loc.cpuTitle : loc.localTitle, style: _getTextStyle(themeType, TextStyle(fontSize: 26, fontWeight: FontWeight.w900, color: inkColor, letterSpacing: 2))),
|
||||||
const SizedBox(height: 25),
|
const SizedBox(height: 25),
|
||||||
|
|
||||||
Text("FORMA ARENA", style: _getTextStyle(themeType, TextStyle(fontSize: 14, fontWeight: FontWeight.w900, color: inkColor.withOpacity(0.6), letterSpacing: 1.5))),
|
Text("FORMA ARENA", style: _getTextStyle(themeType, TextStyle(fontSize: 14, fontWeight: FontWeight.w900, color: inkColor.withOpacity(0.6), letterSpacing: 1.5))),
|
||||||
|
|
@ -667,7 +670,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 65, width: double.infinity,
|
height: 65, width: double.infinity,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
child: Text("AVVIA PARTITA", style: _getTextStyle(themeType, TextStyle(fontSize: 22, fontWeight: FontWeight.w900, letterSpacing: 3.0, color: inkColor))),
|
child: Text(loc.startGame, style: _getTextStyle(themeType, TextStyle(fontSize: 22, fontWeight: FontWeight.w900, letterSpacing: 3.0, color: inkColor))),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -692,7 +695,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Text(isVsCPU ? "SFIDA IA" : "MODALITÀ LOCALE", style: _getTextStyle(themeType, TextStyle(fontSize: 24, fontWeight: FontWeight.w900, color: theme.text, letterSpacing: 2))),
|
Text(isVsCPU ? loc.cpuTitle : loc.localTitle, style: _getTextStyle(themeType, TextStyle(fontSize: 24, fontWeight: FontWeight.w900, color: theme.text, letterSpacing: 2))),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
|
|
||||||
Text("FORMA ARENA", style: _getTextStyle(themeType, TextStyle(fontSize: 12, fontWeight: FontWeight.w900, color: theme.text.withOpacity(0.5), letterSpacing: 1.5))),
|
Text("FORMA ARENA", style: _getTextStyle(themeType, TextStyle(fontSize: 12, fontWeight: FontWeight.w900, color: theme.text.withOpacity(0.5), letterSpacing: 1.5))),
|
||||||
|
|
@ -743,7 +746,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
context.read<GameController>().startNewGame(localRadius, vsCPU: isVsCPU, shape: localShape, timeMode: localTimeMode);
|
context.read<GameController>().startNewGame(localRadius, vsCPU: isVsCPU, shape: localShape, timeMode: localTimeMode);
|
||||||
Navigator.push(context, MaterialPageRoute(builder: (_) => const GameScreen()));
|
Navigator.push(context, MaterialPageRoute(builder: (_) => const GameScreen()));
|
||||||
},
|
},
|
||||||
child: const Text("AVVIA PARTITA", style: TextStyle(fontSize: 18, fontWeight: FontWeight.w900, letterSpacing: 2)),
|
child: Text(loc.startGame, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w900, letterSpacing: 2)),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
|
@ -775,6 +778,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
final theme = themeManager.currentColors;
|
final theme = themeManager.currentColors;
|
||||||
final themeType = themeManager.currentThemeType;
|
final themeType = themeManager.currentThemeType;
|
||||||
Color inkColor = const Color(0xFF111122);
|
Color inkColor = const Color(0xFF111122);
|
||||||
|
final loc = AppLocalizations.of(context)!;
|
||||||
|
|
||||||
return Dialog(
|
return Dialog(
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
|
|
@ -792,7 +796,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.assignment_turned_in, size: 50, color: theme.playerBlue),
|
Icon(Icons.assignment_turned_in, size: 50, color: theme.playerBlue),
|
||||||
const SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
Text("SFIDE GIORNALIERE", style: _getTextStyle(themeType, TextStyle(fontSize: 22, fontWeight: FontWeight.w900, color: theme.text, letterSpacing: 1.5))),
|
Text(loc.questsTitle, style: _getTextStyle(themeType, TextStyle(fontSize: 22, fontWeight: FontWeight.w900, color: theme.text, letterSpacing: 1.5))),
|
||||||
const SizedBox(height: 25),
|
const SizedBox(height: 25),
|
||||||
|
|
||||||
// Generiamo dinamicamente le 3 missioni salvate in memoria
|
// Generiamo dinamicamente le 3 missioni salvate in memoria
|
||||||
|
|
@ -874,6 +878,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
final themeManager = ctx.watch<ThemeManager>();
|
final themeManager = ctx.watch<ThemeManager>();
|
||||||
final theme = themeManager.currentColors;
|
final theme = themeManager.currentColors;
|
||||||
final themeType = themeManager.currentThemeType;
|
final themeType = themeManager.currentThemeType;
|
||||||
|
final loc = AppLocalizations.of(context)!;
|
||||||
|
|
||||||
Widget content = Container(
|
Widget content = Container(
|
||||||
padding: const EdgeInsets.all(20.0),
|
padding: const EdgeInsets.all(20.0),
|
||||||
|
|
@ -888,7 +893,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.emoji_events, size: 50, color: Colors.amber),
|
Icon(Icons.emoji_events, size: 50, color: Colors.amber),
|
||||||
const SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
Text("CLASSIFICA MONDIALE", style: _getTextStyle(themeType, TextStyle(fontSize: 20, fontWeight: FontWeight.w900, color: theme.text, letterSpacing: 1.5))),
|
Text(loc.leaderboardTitle, style: _getTextStyle(themeType, TextStyle(fontSize: 20, fontWeight: FontWeight.w900, color: theme.text, letterSpacing: 1.5))),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
|
|
||||||
// Lista giocatori pescata da Firebase!
|
// Lista giocatori pescata da Firebase!
|
||||||
|
|
@ -971,6 +976,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
final theme = themeManager.currentColors;
|
final theme = themeManager.currentColors;
|
||||||
final themeType = themeManager.currentThemeType;
|
final themeType = themeManager.currentThemeType;
|
||||||
Color inkColor = const Color(0xFF111122);
|
Color inkColor = const Color(0xFF111122);
|
||||||
|
final loc = AppLocalizations.of(context)!;
|
||||||
|
|
||||||
String goldLabel = themeType == AppThemeType.grimorio ? "CORONA:" : "ORO:";
|
String goldLabel = themeType == AppThemeType.grimorio ? "CORONA:" : "ORO:";
|
||||||
String bombLabel = themeType == AppThemeType.grimorio ? "STREGA:" : "BOMBA:";
|
String bombLabel = themeType == AppThemeType.grimorio ? "STREGA:" : "BOMBA:";
|
||||||
|
|
@ -1106,6 +1112,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
final themeType = themeManager.currentThemeType;
|
final themeType = themeManager.currentThemeType;
|
||||||
final theme = themeManager.currentColors;
|
final theme = themeManager.currentColors;
|
||||||
Color inkColor = const Color(0xFF111122);
|
Color inkColor = const Color(0xFF111122);
|
||||||
|
final loc = AppLocalizations.of(context)!;
|
||||||
|
|
||||||
String? bgImage;
|
String? bgImage;
|
||||||
if (themeType == AppThemeType.wood) bgImage = 'assets/images/wood_bg.jpg';
|
if (themeType == AppThemeType.wood) bgImage = 'assets/images/wood_bg.jpg';
|
||||||
|
|
@ -1245,7 +1252,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
child: FittedBox(
|
child: FittedBox(
|
||||||
fit: BoxFit.scaleDown,
|
fit: BoxFit.scaleDown,
|
||||||
child: Text(
|
child: Text(
|
||||||
"TETRAQ",
|
loc.appTitle.toUpperCase(),
|
||||||
style: _getTextStyle(themeType, TextStyle(
|
style: _getTextStyle(themeType, TextStyle(
|
||||||
fontSize: 65,
|
fontSize: 65,
|
||||||
fontWeight: FontWeight.w900,
|
fontWeight: FontWeight.w900,
|
||||||
|
|
@ -1268,19 +1275,19 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
Column(
|
Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
children: [
|
children: [
|
||||||
_buildCyberCard(_FeatureCard(title: "ONLINE", subtitle: "Sfida il mondo", icon: Icons.public, color: Colors.lightBlue.shade200, theme: theme, themeType: themeType, isFeatured: true, onTap: () { Navigator.push(context, MaterialPageRoute(builder: (_) => const LobbyScreen())); }), themeType),
|
_buildCyberCard(_FeatureCard(title: loc.onlineTitle, subtitle: loc.onlineSub, icon: Icons.public, color: Colors.lightBlue.shade200, theme: theme, themeType: themeType, isFeatured: true, onTap: () { Navigator.push(context, MaterialPageRoute(builder: (_) => const LobbyScreen())); }), themeType),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
_buildCyberCard(_FeatureCard(title: "VS CPU", subtitle: "Allenati con l'IA", icon: Icons.smart_toy, color: Colors.purple.shade200, theme: theme, themeType: themeType, onTap: () => _showMatchSetupDialog(true)), themeType),
|
_buildCyberCard(_FeatureCard(title: loc.cpuTitle, subtitle: loc.cpuSub, icon: Icons.smart_toy, color: Colors.purple.shade200, theme: theme, themeType: themeType, onTap: () => _showMatchSetupDialog(true)), themeType),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
_buildCyberCard(_FeatureCard(title: "LOCALE", subtitle: "Stesso schermo", icon: Icons.people_alt, color: Colors.red.shade200, theme: theme, themeType: themeType, onTap: () => _showMatchSetupDialog(false)), themeType),
|
_buildCyberCard(_FeatureCard(title: loc.localTitle, subtitle: loc.localSub, icon: Icons.people_alt, color: Colors.red.shade200, theme: theme, themeType: themeType, onTap: () => _showMatchSetupDialog(false)), themeType),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
|
|
||||||
// NUOVI BOTTONI PER LA VERSIONE 2.0
|
// NUOVI BOTTONI PER LA VERSIONE 2.0
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(child: _buildCyberCard(_FeatureCard(title: "CLASSIFICA", subtitle: "Top 50 Globale", icon: Icons.leaderboard, color: Colors.amber.shade200, theme: theme, themeType: themeType, onTap: _showLeaderboardDialog, compact: true), themeType)),
|
Expanded(child: _buildCyberCard(_FeatureCard(title: loc.leaderboardTitle, subtitle: "Top 50 Globale", icon: Icons.leaderboard, color: Colors.amber.shade200, theme: theme, themeType: themeType, onTap: _showLeaderboardDialog, compact: true), themeType)),
|
||||||
const SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Expanded(child: _buildCyberCard(_FeatureCard(title: "SFIDE", subtitle: "Missioni", icon: Icons.assignment_turned_in, color: Colors.green.shade200, theme: theme, themeType: themeType, onTap: _showDailyQuestsDialog, compact: true), themeType)),
|
Expanded(child: _buildCyberCard(_FeatureCard(title: loc.questsTitle, subtitle: "Missioni", icon: Icons.assignment_turned_in, color: Colors.green.shade200, theme: theme, themeType: themeType, onTap: _showDailyQuestsDialog, compact: true), themeType)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
@ -1288,9 +1295,9 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
|
||||||
|
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(child: _buildCyberCard(_FeatureCard(title: "TEMI", subtitle: "Personalizza", icon: Icons.palette, color: Colors.teal.shade200, theme: theme, themeType: themeType, onTap: () => Navigator.push(context, MaterialPageRoute(builder: (_) => const SettingsScreen())), compact: true), themeType)),
|
Expanded(child: _buildCyberCard(_FeatureCard(title: loc.themesTitle, subtitle: "Personalizza", icon: Icons.palette, color: Colors.teal.shade200, theme: theme, themeType: themeType, onTap: () => Navigator.push(context, MaterialPageRoute(builder: (_) => const SettingsScreen())), compact: true), themeType)),
|
||||||
const SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Expanded(child: _buildCyberCard(_FeatureCard(title: "TUTORIAL", subtitle: "Come giocare", icon: Icons.school, color: Colors.indigo.shade200, theme: theme, themeType: themeType, onTap: _showTutorialDialog, compact: true), themeType)),
|
Expanded(child: _buildCyberCard(_FeatureCard(title: loc.tutorialTitle, subtitle: "Come giocare", icon: Icons.school, color: Colors.indigo.shade200, theme: theme, themeType: themeType, onTap: _showTutorialDialog, compact: true), themeType)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -129,6 +129,14 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.2"
|
||||||
|
change_app_package_name:
|
||||||
|
dependency: "direct dev"
|
||||||
|
description:
|
||||||
|
name: change_app_package_name
|
||||||
|
sha256: "8e43b754fe960426904d77ed4c62fa8c9834deaf6e293ae40963fa447482c4c5"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.5.0"
|
||||||
characters:
|
characters:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
name: tetraq
|
name: tetraq
|
||||||
description: A new Flutter project.
|
description: A new Flutter project.
|
||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
version: 1.0.2+4
|
version: 1.1.3+5
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.10.7
|
sdk: ^3.10.7
|
||||||
|
|
||||||
|
|
@ -31,6 +31,7 @@ dev_dependencies:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_lints: ^6.0.0
|
flutter_lints: ^6.0.0
|
||||||
flutter_launcher_icons: ^0.13.1
|
flutter_launcher_icons: ^0.13.1
|
||||||
|
change_app_package_name: ^1.5.0
|
||||||
|
|
||||||
flutter:
|
flutter:
|
||||||
uses-material-design: true
|
uses-material-design: true
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue