commit 117c9305fc570512599012fa1bb6dab023cffafb Author: Fson Date: Mon Aug 19 15:11:49 2024 +0800 初始提交 diff --git a/.fvmrc b/.fvmrc new file mode 100644 index 0000000..4efffa7 --- /dev/null +++ b/.fvmrc @@ -0,0 +1,3 @@ +{ + "flutter": "3.22.1" +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..65749af --- /dev/null +++ b/.gitignore @@ -0,0 +1,141 @@ +# Do not remove or rename entries in this file, only add new ones +# See https://github.com/flutter/flutter/issues/128635 for more context. + +# Miscellaneous +*.class +*.lock +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# Visual Studio Code related +.classpath +.project +.settings/ +.vscode/* + +# Flutter repo-specific +/bin/cache/ +/bin/internal/bootstrap.bat +/bin/internal/bootstrap.sh +/bin/mingit/ +/dev/benchmarks/mega_gallery/ +/dev/bots/.recipe_deps +/dev/bots/android_tools/ +/dev/devicelab/ABresults*.json +/dev/docs/doc/ +/dev/docs/api_docs.zip +/dev/docs/flutter.docs.zip +/dev/docs/lib/ +/dev/docs/pubspec.yaml +/dev/integration_tests/**/xcuserdata +/dev/integration_tests/**/Pods +/packages/flutter/coverage/ +version +analysis_benchmark.json + +# packages file containing multi-root paths +.packages.generated + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +**/generated_plugin_registrant.dart +.packages +.pub-preload-cache/ +.pub-cache/ +.pub/ +build/ +flutter_*.png +linked_*.ds +unlinked.ds +unlinked_spec.ds + +# Android related +**/android/**/gradle-wrapper.jar +.gradle/ +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java +#**/android/key.properties +#*.jks + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/.last_build_id +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Flutter.podspec +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/ephemeral +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# macOS +**/Flutter/ephemeral/ +**/Pods/ +**/macos/Flutter/GeneratedPluginRegistrant.swift +**/macos/Flutter/ephemeral +**/xcuserdata/ + +# Windows +**/windows/flutter/generated_plugin_registrant.cc +**/windows/flutter/generated_plugin_registrant.h +**/windows/flutter/generated_plugins.cmake + +# Linux +**/linux/flutter/generated_plugin_registrant.cc +**/linux/flutter/generated_plugin_registrant.h +**/linux/flutter/generated_plugins.cmake + +# Coverage +coverage/ + +# Symbols +app.*.symbols + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +!/dev/ci/**/Gemfile.lock +!.vscode/settings.json + +# FVM Version Cache +.fvm/ \ No newline at end of file diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..28c13bd --- /dev/null +++ b/.metadata @@ -0,0 +1,33 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + - platform: android + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + - platform: ios + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/README.md b/README.md new file mode 100644 index 0000000..e33c2ec --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# flutter_translate + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..6156bda --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,62 @@ +plugins { + id "com.android.application" + // START: FlutterFire Configuration + id 'com.google.gms.google-services' + id 'com.google.firebase.crashlytics' + // END: FlutterFire Configuration + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file("local.properties") +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader("UTF-8") { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty("flutter.versionCode") +if (flutterVersionCode == null) { + flutterVersionCode = "1" +} + +def flutterVersionName = localProperties.getProperty("flutter.versionName") +if (flutterVersionName == null) { + flutterVersionName = "1.0" +} + +android { + namespace = "com.flutter.translate.flutter_translate" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.flutter.translate.flutter_translate" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutterVersionCode.toInteger() + versionName = flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.debug + } + } +} + +flutter { + source = "../.." +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..0b410b7 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/java/com/flutter/translate/flutter_translate/MainActivity.java b/android/app/src/main/java/com/flutter/translate/flutter_translate/MainActivity.java new file mode 100644 index 0000000..1c400ce --- /dev/null +++ b/android/app/src/main/java/com/flutter/translate/flutter_translate/MainActivity.java @@ -0,0 +1,6 @@ +package com.flutter.translate.flutter_translate; + +import io.flutter.embedding.android.FlutterActivity; + +public class MainActivity extends FlutterActivity { +} diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png new file mode 100644 index 0000000..d531df5 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 0000000..75d8783 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png new file mode 100644 index 0000000..4bdfcea Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png new file mode 100644 index 0000000..67fa85c Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000..3393a81 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..88c4dfd --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,6 @@ + + + Easy translation + 1604127000445610 + e545fee5752a28a03c99f79c7e4d823b + \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..d2ffbff --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,18 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = "../build" +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..3b5b324 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e1ca574 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..5959482 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,29 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false + // START: FlutterFire Configuration + id "com.google.gms.google-services" version "4.3.15" apply false + id "com.google.firebase.crashlytics" version "2.8.1" apply false + // END: FlutterFire Configuration + id "org.jetbrains.kotlin.android" version "1.7.10" apply false +} + +include ":app" diff --git a/assets/gif/empty_state.gif b/assets/gif/empty_state.gif new file mode 100644 index 0000000..d9f559c Binary files /dev/null and b/assets/gif/empty_state.gif differ diff --git a/assets/gif/setting_subscript.gif b/assets/gif/setting_subscript.gif new file mode 100644 index 0000000..187a80a Binary files /dev/null and b/assets/gif/setting_subscript.gif differ diff --git a/assets/gif/subscript.gif b/assets/gif/subscript.gif new file mode 100644 index 0000000..52cb538 Binary files /dev/null and b/assets/gif/subscript.gif differ diff --git a/assets/icon/arrow_bottom.png b/assets/icon/arrow_bottom.png new file mode 100755 index 0000000..77959fe Binary files /dev/null and b/assets/icon/arrow_bottom.png differ diff --git a/assets/icon/arrow_right.png b/assets/icon/arrow_right.png new file mode 100755 index 0000000..521ba92 Binary files /dev/null and b/assets/icon/arrow_right.png differ diff --git a/assets/icon/back.png b/assets/icon/back.png new file mode 100755 index 0000000..688b791 Binary files /dev/null and b/assets/icon/back.png differ diff --git a/assets/icon/convert.png b/assets/icon/convert.png new file mode 100755 index 0000000..5e3185e Binary files /dev/null and b/assets/icon/convert.png differ diff --git a/assets/icon/copy.png b/assets/icon/copy.png new file mode 100755 index 0000000..9d6cfdb Binary files /dev/null and b/assets/icon/copy.png differ diff --git a/assets/icon/delete.png b/assets/icon/delete.png new file mode 100755 index 0000000..7fdb575 Binary files /dev/null and b/assets/icon/delete.png differ diff --git a/assets/icon/full_screen.png b/assets/icon/full_screen.png new file mode 100755 index 0000000..ce84388 Binary files /dev/null and b/assets/icon/full_screen.png differ diff --git a/assets/icon/home_microphone.png b/assets/icon/home_microphone.png new file mode 100755 index 0000000..5511e89 Binary files /dev/null and b/assets/icon/home_microphone.png differ diff --git a/assets/icon/home_title_more.png b/assets/icon/home_title_more.png new file mode 100644 index 0000000..76d64c8 Binary files /dev/null and b/assets/icon/home_title_more.png differ diff --git a/assets/icon/microphone.png b/assets/icon/microphone.png new file mode 100755 index 0000000..d6ef8ea Binary files /dev/null and b/assets/icon/microphone.png differ diff --git a/assets/icon/rotate.png b/assets/icon/rotate.png new file mode 100755 index 0000000..1404164 Binary files /dev/null and b/assets/icon/rotate.png differ diff --git a/assets/icon/selected.png b/assets/icon/selected.png new file mode 100644 index 0000000..a3635ab Binary files /dev/null and b/assets/icon/selected.png differ diff --git a/assets/icon/speaker.png b/assets/icon/speaker.png new file mode 100755 index 0000000..b3035e3 Binary files /dev/null and b/assets/icon/speaker.png differ diff --git a/assets/icon/star_green.png b/assets/icon/star_green.png new file mode 100755 index 0000000..d172cdc Binary files /dev/null and b/assets/icon/star_green.png differ diff --git a/assets/icon/tools.png b/assets/icon/tools.png new file mode 100644 index 0000000..4824352 Binary files /dev/null and b/assets/icon/tools.png differ diff --git a/assets/icon/tools_dialog.png b/assets/icon/tools_dialog.png new file mode 100755 index 0000000..5ba75f8 Binary files /dev/null and b/assets/icon/tools_dialog.png differ diff --git a/assets/icon/tools_history.png b/assets/icon/tools_history.png new file mode 100755 index 0000000..00f7b95 Binary files /dev/null and b/assets/icon/tools_history.png differ diff --git a/assets/icon/tools_photo.png b/assets/icon/tools_photo.png new file mode 100755 index 0000000..3a4409d Binary files /dev/null and b/assets/icon/tools_photo.png differ diff --git a/assets/images/daily_quote_dinning.png b/assets/images/daily_quote_dinning.png new file mode 100644 index 0000000..124bcbc Binary files /dev/null and b/assets/images/daily_quote_dinning.png differ diff --git a/assets/images/daily_quote_family.png b/assets/images/daily_quote_family.png new file mode 100644 index 0000000..1491c30 Binary files /dev/null and b/assets/images/daily_quote_family.png differ diff --git a/assets/images/daily_quote_greetings.png b/assets/images/daily_quote_greetings.png new file mode 100644 index 0000000..8d5db21 Binary files /dev/null and b/assets/images/daily_quote_greetings.png differ diff --git a/assets/images/daily_quote_healthy.png b/assets/images/daily_quote_healthy.png new file mode 100644 index 0000000..73bfda5 Binary files /dev/null and b/assets/images/daily_quote_healthy.png differ diff --git a/assets/images/daily_quote_make_friends.png b/assets/images/daily_quote_make_friends.png new file mode 100644 index 0000000..960969d Binary files /dev/null and b/assets/images/daily_quote_make_friends.png differ diff --git a/assets/images/daily_quote_shopping.png b/assets/images/daily_quote_shopping.png new file mode 100644 index 0000000..e050c37 Binary files /dev/null and b/assets/images/daily_quote_shopping.png differ diff --git a/assets/images/daily_quote_study.png b/assets/images/daily_quote_study.png new file mode 100644 index 0000000..00caa3e Binary files /dev/null and b/assets/images/daily_quote_study.png differ diff --git a/assets/images/daily_quote_transportation.png b/assets/images/daily_quote_transportation.png new file mode 100644 index 0000000..ec57dad Binary files /dev/null and b/assets/images/daily_quote_transportation.png differ diff --git a/assets/images/daily_quote_travel.png b/assets/images/daily_quote_travel.png new file mode 100644 index 0000000..426481d Binary files /dev/null and b/assets/images/daily_quote_travel.png differ diff --git a/assets/images/daily_quote_work.png b/assets/images/daily_quote_work.png new file mode 100644 index 0000000..85d0fa2 Binary files /dev/null and b/assets/images/daily_quote_work.png differ diff --git a/assets/images/launch_image.png b/assets/images/launch_image.png new file mode 100755 index 0000000..af6e4ba Binary files /dev/null and b/assets/images/launch_image.png differ diff --git a/assets/images/rabbit_ear.png b/assets/images/rabbit_ear.png new file mode 100755 index 0000000..531cac5 Binary files /dev/null and b/assets/images/rabbit_ear.png differ diff --git a/assets/images/rabbit_face.png b/assets/images/rabbit_face.png new file mode 100644 index 0000000..a86885d Binary files /dev/null and b/assets/images/rabbit_face.png differ diff --git a/assets/images/suspended_decoration.png b/assets/images/suspended_decoration.png new file mode 100755 index 0000000..4e63f78 Binary files /dev/null and b/assets/images/suspended_decoration.png differ diff --git a/assets/json/language.json b/assets/json/language.json new file mode 100644 index 0000000..89911cb --- /dev/null +++ b/assets/json/language.json @@ -0,0 +1,136 @@ +[ + {"languageCode": "af", "languageName": "Afrikaans"}, + {"languageCode": "sq", "languageName": "Albanian"}, + {"languageCode": "am", "languageName": "Amharic"}, + {"languageCode": "ar", "languageName": "Arabic"}, + {"languageCode": "hy", "languageName": "Armenian"}, + {"languageCode": "as", "languageName": "Assamese"}, + {"languageCode": "ay", "languageName": "Aymara"}, + {"languageCode": "az", "languageName": "Azerbaijani"}, + {"languageCode": "bm", "languageName": "Bambara"}, + {"languageCode": "eu", "languageName": "Basque"}, + {"languageCode": "be", "languageName": "Belarusian"}, + {"languageCode": "bn", "languageName": "Bengali"}, + {"languageCode": "bho", "languageName": "Bhojpuri"}, + {"languageCode": "bs", "languageName": "Bosnian"}, + {"languageCode": "bg", "languageName": "Bulgarian"}, + {"languageCode": "ca", "languageName": "Catalan"}, + {"languageCode": "ceb", "languageName": "Cebuano"}, + {"languageCode": "zh-cn", "languageName": "Chinese (Simplified)"}, + {"languageCode": "zh-tw", "languageName": "Chinese (Traditional)"}, + {"languageCode": "co", "languageName": "Corsican"}, + {"languageCode": "hr", "languageName": "Croatian"}, + {"languageCode": "cs", "languageName": "Czech"}, + {"languageCode": "da", "languageName": "Danish"}, + {"languageCode": "dv", "languageName": "Dhivehi"}, + {"languageCode": "doi", "languageName": "Dogri"}, + {"languageCode": "nl", "languageName": "Dutch"}, + {"languageCode": "en", "languageName": "English"}, + {"languageCode": "eo", "languageName": "Esperanto"}, + {"languageCode": "et", "languageName": "Estonian"}, + {"languageCode": "ee", "languageName": "Ewe"}, + {"languageCode": "fil", "languageName": "Filipino (Tagalog)"}, + {"languageCode": "fi", "languageName": "Finnish"}, + {"languageCode": "fr", "languageName": "French"}, + {"languageCode": "fy", "languageName": "Frisian"}, + {"languageCode": "gl", "languageName": "Galician"}, + {"languageCode": "ka", "languageName": "Georgian"}, + {"languageCode": "de", "languageName": "German"}, + {"languageCode": "el", "languageName": "Greek"}, + {"languageCode": "gn", "languageName": "Guarani"}, + {"languageCode": "gu", "languageName": "Gujarati"}, + {"languageCode": "ht", "languageName": "Haitian Creole"}, + {"languageCode": "ha", "languageName": "Hausa"}, + {"languageCode": "haw", "languageName": "Hawaiian"}, + {"languageCode": "he", "languageName": "Hebrew"}, + {"languageCode": "hi", "languageName": "Hindi"}, + {"languageCode": "hmn", "languageName": "Hmong"}, + {"languageCode": "hu", "languageName": "Hungarian"}, + {"languageCode": "is", "languageName": "Icelandic"}, + {"languageCode": "ig", "languageName": "Igbo"}, + {"languageCode": "ilo", "languageName": "Ilocano"}, + {"languageCode": "id", "languageName": "Indonesian"}, + {"languageCode": "ga", "languageName": "Irish"}, + {"languageCode": "it", "languageName": "Italian"}, + {"languageCode": "ja", "languageName": "Japanese"}, + {"languageCode": "jv", "languageName": "Javanese"}, + {"languageCode": "kn", "languageName": "Kannada"}, + {"languageCode": "kk", "languageName": "Kazakh"}, + {"languageCode": "km", "languageName": "Khmer"}, + {"languageCode": "rw", "languageName": "Kinyarwanda"}, + {"languageCode": "gom", "languageName": "Konkani"}, + {"languageCode": "ko", "languageName": "Korean"}, + {"languageCode": "kri", "languageName": "Krio"}, + {"languageCode": "ku", "languageName": "Kurdish (Kurmanji)"}, + {"languageCode": "ckb", "languageName": "Kurdish (Sorani)"}, + {"languageCode": "ky", "languageName": "Kyrgyz"}, + {"languageCode": "lo", "languageName": "Lao"}, + {"languageCode": "la", "languageName": "Latin"}, + {"languageCode": "lv", "languageName": "Latvian"}, + {"languageCode": "ln", "languageName": "Lingala"}, + {"languageCode": "lt", "languageName": "Lithuanian"}, + {"languageCode": "lg", "languageName": "Luganda"}, + {"languageCode": "lb", "languageName": "Luxembourgish"}, + {"languageCode": "mk", "languageName": "Macedonian"}, + {"languageCode": "mai", "languageName": "Maithili"}, + {"languageCode": "mg", "languageName": "Malagasy"}, + {"languageCode": "ms", "languageName": "Malay"}, + {"languageCode": "ml", "languageName": "Malayalam"}, + {"languageCode": "mt", "languageName": "Maltese"}, + {"languageCode": "mi", "languageName": "Maori"}, + {"languageCode": "mr", "languageName": "Marathi"}, + {"languageCode": "mni-mtei", "languageName": "Meiteilon (Manipuri)"}, + {"languageCode": "lus", "languageName": "Mizo"}, + {"languageCode": "mn", "languageName": "Mongolian"}, + {"languageCode": "my", "languageName": "Myanmar (Burmese)'"}, + {"languageCode": "ne", "languageName": "Nepali"}, + {"languageCode": "no", "languageName": "Norwegian"}, + {"languageCode": "ny", "languageName": "Nyanja (Chichewa)"}, + {"languageCode": "or", "languageName": "Odia (Oriya)"}, + {"languageCode": "om", "languageName": "Oromo"}, + {"languageCode": "ps", "languageName": "Pashto"}, + {"languageCode": "fa", "languageName": "Persian"}, + {"languageCode": "pl", "languageName": "Polish"}, + {"languageCode": "pt", "languageName": "Portuguese"}, + {"languageCode": "pa", "languageName": "Punjabi"}, + {"languageCode": "qu", "languageName": "Quechua"}, + {"languageCode": "ro", "languageName": "Romanian"}, + {"languageCode": "ru", "languageName": "Russian"}, + {"languageCode": "sm", "languageName": "Samoan"}, + {"languageCode": "sa", "languageName": "Sanskrit"}, + {"languageCode": "gd", "languageName": "Scots Gaelic"}, + {"languageCode": "nso", "languageName": "Sepedi"}, + {"languageCode": "sr", "languageName": "Serbian"}, + {"languageCode": "st", "languageName": "Sesotho"}, + {"languageCode": "sn", "languageName": "Shona"}, + {"languageCode": "sd", "languageName": "Sindhi"}, + {"languageCode": "si", "languageName": "Sinhala"}, + {"languageCode": "sk", "languageName": "Slovak"}, + {"languageCode": "sl", "languageName": "Slovenian"}, + {"languageCode": "so", "languageName": "Somali"}, + {"languageCode": "es", "languageName": "Spanish"}, + {"languageCode": "su", "languageName": "Sundanese"}, + {"languageCode": "sw", "languageName": "Swahili"}, + {"languageCode": "sv", "languageName": "Swedish"}, + {"languageCode": "tl", "languageName": "Tagalog (Filipino)"}, + {"languageCode": "tg", "languageName": "Tajik"}, + {"languageCode": "ta", "languageName": "Tamil"}, + {"languageCode": "tt", "languageName": "Tatar"}, + {"languageCode": "te", "languageName": "Telugu"}, + {"languageCode": "th", "languageName": "Thai"}, + {"languageCode": "ti", "languageName": "Tigrinya"}, + {"languageCode": "ts", "languageName": "Tsonga"}, + {"languageCode": "tr", "languageName": "Turkish"}, + {"languageCode": "tk", "languageName": "Turkmen"}, + {"languageCode": "ak", "languageName": "Twi (Akan)"}, + {"languageCode": "uk", "languageName": "Ukrainian"}, + {"languageCode": "ur", "languageName": "Urdu"}, + {"languageCode": "ug", "languageName": "Uyghur"}, + {"languageCode": "uz", "languageName": "Uzbek"}, + {"languageCode": "vi", "languageName": "Vietnamese"}, + {"languageCode": "cy", "languageName": "Welsh"}, + {"languageCode": "xh", "languageName": "Xhosa"}, + {"languageCode": "yi", "languageName": "Yiddish"}, + {"languageCode": "yo", "languageName": "Yoruba"}, + {"languageCode": "zu", "languageName": "Zulu"} +] \ No newline at end of file diff --git a/assets/json/scene.json b/assets/json/scene.json new file mode 100644 index 0000000..eaf1794 --- /dev/null +++ b/assets/json/scene.json @@ -0,0 +1,8143 @@ +[ + { + "sceneSource": "Study", + "sceneType": "Study", + "sceneList": [ + { + "English": "I need to study", + "sceneType": "Study", + "Chinese (Simplified)": "我需要学习", + "Spanish": "necesito estudiar", + "Hindi": "मुझे पढ़ने की ज़रूरत है", + "Arabic": "أنا بحاجة إلى دراسة", + "Portuguese": "eu preciso estudar", + "Bengali": "আমি অধ্যয়ন করতে হবে", + "Russian": "мне нужно учиться", + "Japanese": "わたしは勉強が必要", + "Punjabi": "ਮੈਨੂੰ ਅਧਿਐਨ ਕਰਨ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku kudu sinau", + "Korean": "나는 공부해야 해", + "French": "J'ai besoin d'étudier", + "German": "ich muss lernen" + }, + { + "English": "Can you explain this to me?", + "sceneType": "Study", + "Chinese (Simplified)": "你能给我解释一下吗?", + "Spanish": "Me lo puedes explicar?", + "Hindi": "क्या आप मुझे यह समझा सकते हैं?", + "Arabic": "هل يمكن ان توضح لي؟", + "Portuguese": "Voce pode explicar isto para mim?", + "Bengali": "আপনি এটা আমার ব্যাখ্যা করতে পারবেন?", + "Russian": "Можете ли вы объяснить это мне?", + "Japanese": "説明してもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੈਨੂੰ ਇਹ ਸਮਝਾ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa nerangake marang aku?", + "Korean": "나에게 설명해 주실 수 있나요?", + "French": "Pouvez-vous me l'expliquer ?", + "German": "Kannst du es mir erklären?" + }, + { + "English": "What does this word mean?", + "sceneType": "Study", + "Chinese (Simplified)": "这个词是什么意思?", + "Spanish": "¿Qué significa esta palabra?", + "Hindi": "इस शब्द का क्या मतलब है?", + "Arabic": "ماذا تعني هذه الكلمة؟", + "Portuguese": "O que essa palavra significa?", + "Bengali": "এই শব্দের অর্থ কি?", + "Russian": "Что значит это слово?", + "Japanese": "この言葉の意味は何ですか?", + "Punjabi": "ਇਸ ਸ਼ਬਦ ਦਾ ਮਤਲਬ ਕੀ ਹੈ?", + "Javanese": "Apa tegese tembung iki?", + "Korean": "이 말은 무엇을 의미 하는가?", + "French": "Que signifie ce mot?", + "German": "Was bedeutet dieses Wort?" + }, + { + "English": "I have a test tomorrow", + "sceneType": "Study", + "Chinese (Simplified)": "我明天有个考试", + "Spanish": "Tengo un examen mañana", + "Hindi": "कल मेरा एग्जाम हे", + "Arabic": "عندي اختبار غدا", + "Portuguese": "tenho um exame amanhã", + "Bengali": "আগামীকাল আমার একটা পরীক্ষা আছে", + "Russian": "У меня завтра экзамен", + "Japanese": "私は明日試験があります", + "Punjabi": "ਕੱਲ੍ਹ ਮੇਰਾ ਇਮਤਿਹਾਨ ਹੈ", + "Javanese": "Aku sesuk ana ujian", + "Korean": "내일 시험이 있어요", + "French": "j'ai un examen demain", + "German": "Ich habe morgen eine Prüfung" + }, + { + "English": "I'm learning English", + "sceneType": "Study", + "Chinese (Simplified)": "我在学英语", + "Spanish": "estoy aprendiendo inglés", + "Hindi": "मैं अंग्रेज सीख रहा हूं", + "Arabic": "انا اتعلم الانجليزية", + "Portuguese": "eu estou aprendendo inglês", + "Bengali": "আমি ইংরেজী শিখছি", + "Russian": "я учу английский", + "Japanese": "私は英語を勉強しています", + "Punjabi": "ਮੈਂ ਅੰਗਰੇਜ਼ੀ ਸਿੱਖ ਰਿਹਾ ਹਾਂ", + "Javanese": "Aku sinau basa Inggris", + "Korean": "나 영어 배우고있어", + "French": "j'apprends l'anglais", + "German": "Ich lerne Englisch" + }, + { + "English": "Can I borrow a pen?", + "sceneType": "Study", + "Chinese (Simplified)": "我可以借支笔吗?", + "Spanish": "¿Puedo pedir prestado un bolígrafo?", + "Hindi": "क्या मैं एक कलम उधार ले सकता हूं?", + "Arabic": "يمكنني استعارة القلم؟", + "Portuguese": "Pode me emprestar uma caneta?", + "Bengali": "আমি একটি কলম ধার নিতে পারেন?", + "Russian": "Могу ли я одолжить ручку?", + "Japanese": "ペン借りてもいい?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਕ ਪੈੱਨ ਉਧਾਰ ਲੈ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa nyilih pulpen?", + "Korean": "펜 좀 빌려 주실 래요?", + "French": "Puis-je emprunter un stylo?", + "German": "Kann ich mir einen Stift ausleihen?" + }, + { + "English": "Do you have any notes?", + "sceneType": "Study", + "Chinese (Simplified)": "你有笔记吗?", + "Spanish": "¿Tienes notas?", + "Hindi": "क्या आपके पास नोट्स हैं?", + "Arabic": "هل لديك ملاحظات؟", + "Portuguese": "Você tem anotações?", + "Bengali": "আপনি নোট আছে?", + "Russian": "У вас есть заметки?", + "Japanese": "メモはありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਨੋਟ ਹਨ?", + "Javanese": "Apa sampeyan duwe cathetan?", + "Korean": "메모가 있나요?", + "French": "Avez-vous des notes ?", + "German": "Hast du Notizen?" + }, + { + "English": "Can we study together?", + "sceneType": "Study", + "Chinese (Simplified)": "我们可以一起学习吗?", + "Spanish": "¿Podemos estudiar juntos?", + "Hindi": "क्या हम एक साथ पढ़ाई कर सकते हैं?", + "Arabic": "هل يمكننا الدراسة معا؟", + "Portuguese": "Podemos estudar juntos?", + "Bengali": "আমরা একসাথে পড়াশুনা করতে পারি?", + "Russian": "Можем ли мы учиться вместе?", + "Japanese": "一緒に勉強できますか?", + "Punjabi": "ਕੀ ਅਸੀਂ ਇਕੱਠੇ ਅਧਿਐਨ ਕਰ ਸਕਦੇ ਹਾਂ?", + "Javanese": "Apa kita bisa sinau bareng?", + "Korean": "우리 같이 공부할 수 있나요?", + "French": "Est-ce que nous pouvons etudier ensemble?", + "German": "Können wir zusammen lernen?" + }, + { + "English": "What is the homework?", + "sceneType": "Study", + "Chinese (Simplified)": "作业是什么?", + "Spanish": "¿Cual es la tarea?", + "Hindi": "गृह कार्य क्या है?", + "Arabic": "ما هو الواجب المنزلي؟", + "Portuguese": "Qual é a lição de casa?", + "Bengali": "বাড়ির কাজ কি?", + "Russian": "Какое домашнее задание?", + "Japanese": "宿題は何ですか?", + "Punjabi": "ਹੋਮਵਰਕ ਕੀ ਹੈ?", + "Javanese": "Apa PR?", + "Korean": "숙제가 뭐냐?", + "French": "Quel est le devoir?", + "German": "Was ist die Hausaufgabe?" + }, + { + "English": "I need help with this problem", + "sceneType": "Study", + "Chinese (Simplified)": "我需要帮助解决这个问题", + "Spanish": "Necesito ayuda para resolver este problema", + "Hindi": "मुझे इस समस्या को सुलझाने में मदद चाहिए", + "Arabic": "أحتاج إلى مساعدة في حل هذه المشكلة", + "Portuguese": "Preciso de ajuda para resolver esse problema", + "Bengali": "আমি এই সমস্যা সমাধানের সাহায্য প্রয়োজন", + "Russian": "Мне нужна помощь в решении этой проблемы", + "Japanese": "この問題を解決するのに助けが必要です", + "Javanese": "Aku butuh bantuan kanggo ngrampungake masalah iki", + "Korean": "이 문제를 해결하는 데 도움이 필요합니다", + "French": "J'ai besoin d'aide pour résoudre ce problème", + "German": "Ich brauche Hilfe bei der Lösung dieses Problems" + }, + { + "English": "Can you check my work?", + "sceneType": "Study", + "Chinese (Simplified)": "你能检查我的作业吗?", + "Spanish": "¿Puedes revisar mi tarea?", + "Hindi": "क्या आप मेरा होमवर्क जाँच सकते हैं?", + "Arabic": "هل يمكنك التحقق من واجباتي المنزلية؟", + "Portuguese": "Você pode verificar meu dever de casa?", + "Bengali": "আপনি আমার হোমওয়ার্ক পরীক্ষা করতে পারেন?", + "Russian": "Можешь проверить мою домашнюю работу?", + "Japanese": "私の宿題をチェックしてもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੇਰੇ ਹੋਮਵਰਕ ਦੀ ਜਾਂਚ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa mriksa peerku?", + "Korean": "내 숙제 좀 확인해 줄래?", + "French": "Peux-tu vérifier mes devoirs ?", + "German": "Kannst du meine Hausaufgaben überprüfen?" + }, + { + "English": "What chapter are we on?", + "sceneType": "Study", + "Chinese (Simplified)": "我们在学哪一章?", + "Spanish": "¿Qué capítulo estamos estudiando?", + "Hindi": "हम कौन सा अध्याय पढ़ रहे हैं?", + "Arabic": "أي فصل ندرس؟", + "Portuguese": "Qual capítulo estamos estudando?", + "Bengali": "আমরা কোন অধ্যায় অধ্যয়নরত?", + "Russian": "Какую главу мы изучаем?", + "Japanese": "私たちはどの章を勉強しているのでしょうか?", + "Punjabi": "ਅਸੀਂ ਕਿਹੜਾ ਅਧਿਆਇ ਪੜ੍ਹ ਰਹੇ ਹਾਂ?", + "Javanese": "Bab endi sing kita sinau?", + "Korean": "우리는 어느 장을 공부하고 있나요?", + "French": "Quel chapitre étudions-nous ?", + "German": "Welches Kapitel studieren wir?" + }, + { + "English": "Do you understand this?", + "sceneType": "Study", + "Chinese (Simplified)": "你理解这个吗?", + "Spanish": "¿Entiendes esto?", + "Hindi": "आप इस बात को समझ सकते हो?", + "Arabic": "هل تفهم هذا؟", + "Portuguese": "Você entende isso?", + "Bengali": "তুমি কি এটা বুঝ?", + "Russian": "Ты понимаешь это?", + "Japanese": "これわかりますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਇਹ ਸਮਝਦੇ ਹੋ?", + "Javanese": "Sampeyan ngerti iki?", + "Korean": "당신은 이것을 이해합니까?", + "French": "Comprenez-vous cela?", + "German": "Verstehst du das?" + }, + { + "English": "Can you repeat that?", + "sceneType": "Study", + "Chinese (Simplified)": "你能重复一下吗?", + "Spanish": "¿Puede repetir eso?", + "Hindi": "क्या आप उसे दोहरा सकते हैं?", + "Arabic": "هل يمكنك تكرار ذلك؟", + "Portuguese": "Você pode repetir isso?", + "Bengali": "তুমি কি পুনরাবৃত্তি করতে পার সেটি?", + "Russian": "Можете ли вы это повторить?", + "Japanese": "それを繰り返してくれませんか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਇਸ ਨੂੰ ਦੁਹਰਾ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa mbaleni maneh?", + "Korean": "반복해 주실 수 있나요?", + "French": "Peux-tu répéter cela?", + "German": "Kannst du das wiederholen?" + }, + { + "English": "What is the answer?", + "sceneType": "Study", + "Chinese (Simplified)": "答案是什么?", + "Spanish": "¿Cuál es la respuesta?", + "Hindi": "उत्तर क्या है?", + "Arabic": "ماهي الاجابة؟", + "Portuguese": "Qual é a resposta?", + "Russian": "Каков ответ?", + "Japanese": "答えは何ですか?", + "Punjabi": "ਕੀ ਜਵਾਬ ਹੈ?", + "Javanese": "Apa jawabane?", + "Korean": "무엇이 정답인가요?", + "French": "Quelle est la réponse?", + "German": "Was ist die Antwort?" + }, + { + "English": "I need a calculator", + "sceneType": "Study", + "Chinese (Simplified)": "我需要计算器", + "Spanish": "necesito una calculadora", + "Hindi": "मुझे एक कैलकुलेटर चाहिए", + "Arabic": "أحتاج إلى آلة حاسبة", + "Portuguese": "Eu preciso de uma calculadora", + "Bengali": "আমার একটা ক্যালকুলেটর দরকার", + "Russian": "мне нужен калькулятор", + "Japanese": "電卓が必要です", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਕੈਲਕੁਲੇਟਰ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku butuh kalkulator", + "Korean": "계산기가 필요해요", + "French": "j'ai besoin d'une calculatrice", + "German": "Ich brauche einen Taschenrechner" + }, + { + "English": "Can I use your book?", + "sceneType": "Study", + "Chinese (Simplified)": "我可以用你的书吗?", + "Spanish": "¿Puedo usar tu libro?", + "Hindi": "क्या मैं आपकी पुस्तक का उपयोग कर सकता हूँ?", + "Arabic": "هل يمكنني استخدام كتابك؟", + "Portuguese": "Posso usar seu livro?", + "Bengali": "আমি কি আপনার বই ব্যবহার করতে পারি?", + "Russian": "Могу ли я использовать вашу книгу?", + "Japanese": "あなたの本を使ってもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਤੁਹਾਡੀ ਕਿਤਾਬ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa nggunakake buku sampeyan?", + "Korean": "당신 책을 사용해도 될까요?", + "French": "Puis-je utiliser votre livre ?", + "German": "Darf ich Ihr Buch nutzen?" + }, + { + "English": "What time does class start?", + "sceneType": "Study", + "Chinese (Simplified)": "课几点开始?", + "Spanish": "¿A qué hora empieza la clase?", + "Hindi": "कक्षा कितने बजे प्रारंभ होती है?", + "Arabic": "في أي وقت سيبدأ الدرس؟", + "Portuguese": "A que horas começa a aula?", + "Bengali": "ক্লাস কখন শুরু হয়?", + "Russian": "Во сколько начинается урок?", + "Japanese": "授業は何時に始まりますか?", + "Punjabi": "ਕਲਾਸ ਕਿੰਨੇ ਵਜੇ ਸ਼ੁਰੂ ਹੁੰਦੀ ਹੈ?", + "Javanese": "Jam pira kelas diwiwiti?", + "Korean": "수업은 몇시에 시작하나요?", + "French": "A quelle heure la classe commence?", + "German": "Um welche Uhrzeit beginnt der Unterricht?" + }, + { + "English": "I need to do my homework", + "sceneType": "Study", + "Chinese (Simplified)": "我需要做作业", + "Spanish": "necesito hacer mi tarea", + "Hindi": "मुझे अपना होमवर्क करने की ज़रूरत है", + "Arabic": "انا احتاج لعمل واجبي البيتي", + "Portuguese": "eu preciso fazer minha lição de casa", + "Bengali": "আমার হোমওয়ার্ক করতে হবে", + "Russian": "мне нужно сделать домашнее задание", + "Japanese": "宿題をしなければなりません", + "Punjabi": "ਮੈਨੂੰ ਆਪਣਾ ਹੋਮਵਰਕ ਕਰਨ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku kudu nindakake PR", + "Korean": "나 숙제해야 해", + "French": "je dois faire mes devoirs", + "German": "Ich muss meine Hausaufgaben machen" + }, + { + "English": "Can you help me study?", + "sceneType": "Study", + "Chinese (Simplified)": "你能帮我学习吗?", + "Hindi": "क्या आप मुझे पढ़ाई में मदद कर सकते हैं?", + "Arabic": "هل يمكنك مساعدتي في الدراسة؟", + "Portuguese": "Você pode me ajudar a estudar?", + "Bengali": "আপনি আমাকে অধ্যয়ন করতে সাহায্য করতে পারেন?", + "Russian": "Можете ли вы помочь мне учиться?", + "Japanese": "勉強を手伝ってくれませんか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੈਨੂੰ ਅਧਿਐਨ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa mbantu aku sinau?", + "Korean": "제가 공부하는 것을 도와주실 수 있나요?", + "French": "Pouvez-vous m'aider à étudier ?", + "German": "Kannst du mir beim Lernen helfen?" + }, + { + "English": "What page are we on?", + "sceneType": "Study", + "Chinese (Simplified)": "我们在第几页?", + "Spanish": "¿En qué página estamos?", + "Hindi": "हम किस पेज पर हैं?", + "Arabic": "في أي صفحة نحن؟", + "Portuguese": "Em que página estamos?", + "Bengali": "আমরা কোন পৃষ্ঠায় আছি?", + "Russian": "На какой мы странице?", + "Japanese": "何ページ?", + "Punjabi": "ਅਸੀਂ ਕਿਸ ਪੰਨੇ 'ਤੇ ਹਾਂ?", + "Javanese": "Apa kaca kita?", + "Korean": "우리는 어떤 페이지에 있나요?", + "French": "Sur quelle page sommes-nous?", + "German": "Auf welcher Seite sind wir?" + }, + { + "English": "Do you have a study guide?", + "sceneType": "Study", + "Chinese (Simplified)": "你有学习指南吗?", + "Spanish": "¿Tienes una guía de estudio?", + "Hindi": "क्या आपके पास कोई अध्ययन मार्गदर्शिका है?", + "Arabic": "هل لديك دليل دراسي؟", + "Portuguese": "Você tem um guia de estudo?", + "Bengali": "আপনি একটি অধ্যয়ন গাইড আছে?", + "Russian": "У вас есть учебное пособие?", + "Japanese": "学習ガイドはありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਸਟੱਡੀ ਗਾਈਡ ਹੈ?", + "Javanese": "Apa sampeyan duwe pandhuan sinau?", + "Korean": "학습 가이드가 있나요?", + "French": "Avez-vous un guide d'étude?", + "German": "Haben Sie einen Studienführer?" + }, + { + "English": "I need to review my notes", + "sceneType": "Study", + "Chinese (Simplified)": "我需要复习笔记", + "Spanish": "necesito revisar mis notas", + "Hindi": "मुझे अपने नोट्स की समीक्षा करने की आवश्यकता है", + "Arabic": "أحتاج إلى مراجعة ملاحظاتي", + "Portuguese": "Preciso revisar minhas anotações", + "Bengali": "আমি আমার নোট পর্যালোচনা করতে হবে", + "Russian": "Мне нужно просмотреть свои записи", + "Japanese": "自分のメモを見直す必要があります", + "Punjabi": "ਮੈਨੂੰ ਆਪਣੇ ਨੋਟਸ ਦੀ ਸਮੀਖਿਆ ਕਰਨ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku kudu mriksa cathetanku", + "Korean": "내 메모를 검토해야 해요", + "French": "Je dois revoir mes notes", + "German": "Ich muss meine Notizen überprüfen" + }, + { + "English": "Can I ask a question?", + "sceneType": "Study", + "Chinese (Simplified)": "我可以问个问题吗?", + "Spanish": "¿Puedo hacer una pregunta?", + "Hindi": "क्या मेरे द्वारा एक सवाल पूछा जा सकता है?", + "Arabic": "هل استطيع ان اسال سؤال؟", + "Portuguese": "Posso fazer uma pergunta?", + "Bengali": "আমি কি একটি প্রশ্ন করতে পারি?", + "Russian": "Могу я задать вопрос?", + "Japanese": "質問してもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਕ ਸਵਾਲ ਪੁੱਛ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa takon?", + "Korean": "질문해도 될까요?", + "French": "Puis-je poser une question?", + "German": "Kann ich eine Frage stellen?" + }, + { + "English": "What did the teacher say?", + "sceneType": "Study", + "Chinese (Simplified)": "老师说了什么?", + "Spanish": "¿Qué dijo el profesor?", + "Hindi": "टीचर ने क्या कहा?", + "Arabic": "ماذا قال المعلم؟", + "Portuguese": "O que o professor disse?", + "Bengali": "কি বললেন শিক্ষক?", + "Russian": "Что сказал учитель?", + "Japanese": "先生は何と言いましたか?", + "Punjabi": "ਅਧਿਆਪਕ ਨੇ ਕੀ ਕਿਹਾ?", + "Javanese": "Apa sing diomongake guru?", + "Korean": "선생님이 뭐라고 하셨어요?", + "French": "Qu'a dit le professeur ?", + "German": "Was hat der Lehrer gesagt?" + }, + { + "English": "I need to finish this project", + "sceneType": "Study", + "Chinese (Simplified)": "我需要完成这个项目", + "Spanish": "Necesito completar este proyecto", + "Hindi": "मुझे यह प्रोजेक्ट पूरा करना है", + "Arabic": "أحتاج لإكمال هذا المشروع", + "Portuguese": "preciso concluir esse projeto", + "Bengali": "আমি এই প্রকল্প সম্পূর্ণ করতে হবে", + "Russian": "Мне нужно завершить этот проект", + "Japanese": "このプロジェクトを完了する必要があります", + "Punjabi": "ਮੈਨੂੰ ਇਸ ਪ੍ਰੋਜੈਕਟ ਨੂੰ ਪੂਰਾ ਕਰਨ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku kudu ngrampungake proyek iki", + "Korean": "나는 이 프로젝트를 완료해야 해요", + "French": "Je dois terminer ce projet", + "German": "Ich muss dieses Projekt abschließen" + }, + { + "English": "Can we work on this together?", + "sceneType": "Study", + "Chinese (Simplified)": "我们可以一起做这个吗?", + "Spanish": "¿Podemos hacer esto juntos?", + "Hindi": "क्या हम एक साथ ऐसा कर सकते हैं?", + "Arabic": "هل يمكننا أن نفعل هذا معا؟", + "Portuguese": "Podemos fazer isso juntos?", + "Bengali": "আমরা একসাথে এটা করতে পারি?", + "Russian": "Можем ли мы сделать это вместе?", + "Japanese": "一緒にやってみませんか?", + "Punjabi": "ਕੀ ਅਸੀਂ ਇਹ ਇਕੱਠੇ ਕਰ ਸਕਦੇ ਹਾਂ?", + "Javanese": "Apa kita bisa nindakake iki bebarengan?", + "Korean": "우리 함께 할 수 있나요?", + "French": "Pouvons-nous faire ça ensemble ?", + "German": "Können wir das gemeinsam schaffen?" + }, + { + "English": "What is the due date?", + "sceneType": "Study", + "Chinese (Simplified)": "截止日期是什么时候?", + "Spanish": "¿Cuando es la fecha límite?", + "Hindi": "अंतिम तिथि कब है?", + "Arabic": "متى سيكون الموعد النهائى؟", + "Portuguese": "Qual é o prazo?", + "Bengali": "সময়সীমা কখন?", + "Russian": "Когда крайний срок?", + "Japanese": "期限はいつですか?", + "Punjabi": "ਅੰਤਮ ਤਾਰੀਖ ਕਦੋਂ ਹੈ?", + "Javanese": "Kapan deadline?", + "Korean": "마감일은 언제입니까?", + "French": "Quand est la date limite?", + "German": "Wann ist die Frist?" + }, + { + "English": "Can you explain this concept?", + "sceneType": "Study", + "Chinese (Simplified)": "你能解释一下这个概念吗?", + "Spanish": "¿Puedes explicar este concepto?", + "Hindi": "क्या आप इस अवधारणा को समझा सकते हैं?", + "Arabic": "هل يمكنك شرح هذا المفهوم؟", + "Portuguese": "Você pode explicar esse conceito?", + "Bengali": "আপনি এই ধারণা ব্যাখ্যা করতে পারেন?", + "Russian": "Можете ли вы объяснить эту концепцию?", + "Japanese": "この概念を説明していただけますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਇਸ ਧਾਰਨਾ ਦੀ ਵਿਆਖਿਆ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa nerangake konsep iki?", + "Korean": "이 개념을 설명할 수 있나요?", + "French": "Pouvez-vous expliquer cette notion ?", + "German": "Können Sie dieses Konzept erklären?" + }, + { + "English": "I need to take notes", + "sceneType": "Study", + "Chinese (Simplified)": "我需要做笔记", + "Spanish": "necesito tomar notas", + "Hindi": "मुझे नोट्स लेने की जरूरत है", + "Arabic": "أحتاج إلى تدوين الملاحظات", + "Portuguese": "preciso fazer anotações", + "Bengali": "আমার নোট নেওয়া দরকার", + "Russian": "мне нужно делать заметки", + "Japanese": "メモをとる必要があります", + "Punjabi": "ਮੈਨੂੰ ਨੋਟਸ ਲੈਣ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku kudu nyathet", + "Korean": "메모를 해야 해요", + "French": "je dois prendre des notes", + "German": "Ich muss mir Notizen machen" + }, + { + "English": "Can I join your study group?", + "sceneType": "Study", + "Chinese (Simplified)": "我可以加入你们的学习小组吗?", + "Spanish": "¿Puedo unirme a tu grupo de estudio?", + "Hindi": "क्या मैं आपके अध्ययन समूह में शामिल हो सकता हूँ?", + "Arabic": "هل يمكنني الانضمام إلى مجموعتك الدراسية؟", + "Portuguese": "Posso participar do seu grupo de estudos?", + "Bengali": "আমি কি আপনার স্টাডি গ্রুপে যোগ দিতে পারি?", + "Russian": "Могу ли я присоединиться к вашей учебной группе?", + "Japanese": "あなたの勉強会に参加してもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਤੁਹਾਡੇ ਅਧਿਐਨ ਸਮੂਹ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa melu grup sinau sampeyan?", + "Korean": "당신의 스터디 그룹에 참여할 수 있나요?", + "French": "Puis-je rejoindre votre groupe d'étude ?", + "German": "Kann ich Ihrer Lerngruppe beitreten?" + }, + { + "English": "What is the main idea?", + "sceneType": "Study", + "Chinese (Simplified)": "主要观点是什么?", + "Spanish": "¿Cuál es el punto principal?", + "Hindi": "मुख्य बात क्या है?", + "Arabic": "ما هي النقطة الرئيسية؟", + "Portuguese": "Qual é o ponto principal?", + "Bengali": "মূল পয়েন্ট কি?", + "Russian": "В чем суть?", + "Japanese": "要点は何ですか?", + "Punjabi": "ਮੁੱਖ ਨੁਕਤਾ ਕੀ ਹੈ?", + "Javanese": "Apa titik utama?", + "Korean": "요점은 무엇입니까?", + "French": "Quel est le point principal ?", + "German": "Was ist der Hauptpunkt?" + }, + { + "English": "I need more time to study", + "sceneType": "Study", + "Chinese (Simplified)": "我需要更多时间学习", + "Spanish": "necesito mas tiempo para estudiar", + "Hindi": "मुझे पढ़ाई के लिए और समय चाहिए", + "Arabic": "أحتاج إلى مزيد من الوقت للدراسة", + "Portuguese": "Preciso de mais tempo para estudar", + "Bengali": "আমার পড়াশোনার জন্য আরও সময় দরকার", + "Russian": "мне нужно больше времени на учебу", + "Japanese": "もっと勉強する時間が必要です", + "Punjabi": "ਮੈਨੂੰ ਅਧਿਐਨ ਕਰਨ ਲਈ ਹੋਰ ਸਮਾਂ ਚਾਹੀਦਾ ਹੈ", + "Javanese": "Aku butuh wektu luwih akeh kanggo sinau", + "Korean": "공부할 시간이 더 필요해요", + "French": "J'ai besoin de plus de temps pour étudier", + "German": "Ich brauche mehr Zeit zum Lernen" + }, + { + "English": "Can you help me with my homework?", + "sceneType": "Study", + "Chinese (Simplified)": "你能帮我做作业吗?", + "Spanish": "¿Puedes ayudarme con mi tarea?", + "Hindi": "क्या आप मेरे होमवर्क में मेरी मदद कर सकते हैं?", + "Arabic": "هل يمكنك مساعدتي في واجباتي المنزلية؟", + "Portuguese": "Você pode me ajudar com meu dever de casa?", + "Bengali": "আপনি কি আমার বাড়ির কাজের সাথে আমাকে সাহায্য করতে পারেন?", + "Russian": "Ты можешь помочь мне с домашним заданием?", + "Japanese": "宿題、手伝ってくれる?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੇਰੇ ਹੋਮਵਰਕ ਵਿੱਚ ਮੇਰੀ ਮਦਦ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa nulungi aku nggarap PR?", + "Korean": "내 숙제 도와 줄수있어?", + "French": "Peux-tu m'aider pour mes devoirs?", + "German": "Kannst du mir mit meinen Hausaufgaben helfen?" + }, + { + "English": "What is the topic?", + "sceneType": "Study", + "Chinese (Simplified)": "主题是什么?", + "Spanish": "¿Cuál es el tema?", + "Arabic": "ما هي الفكرة الرئيسية؟", + "Portuguese": "Qual é o tema?", + "Bengali": "থিম কি?", + "Russian": "Какова тема?", + "Japanese": "テーマは何ですか?", + "Punjabi": "ਥੀਮ ਕੀ ਹੈ?", + "Javanese": "Apa tema kasebut?", + "Korean": "테마는 무엇입니까?", + "French": "Quel est le thème ?", + "German": "Was ist das Thema?" + }, + { + "English": "I need to read this book", + "sceneType": "Study", + "Chinese (Simplified)": "我需要读这本书", + "Spanish": "Necesito leer este libro", + "Hindi": "मुझे यह किताब पढ़नी है", + "Arabic": "أحتاج لقراءة هذا الكتاب", + "Portuguese": "eu preciso ler esse livro", + "Bengali": "আমার এই বইটি পড়তে হবে", + "Russian": "мне нужно прочитать эту книгу", + "Japanese": "この本を読まなければなりません", + "Punjabi": "ਮੈਨੂੰ ਇਹ ਕਿਤਾਬ ਪੜ੍ਹਨ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku kudu maca buku iki", + "Korean": "나 이 책을 읽어야 해", + "French": "j'ai besoin de lire ce livre", + "German": "Ich muss dieses Buch lesen" + }, + { + "English": "Can you summarize this for me?", + "sceneType": "Study", + "Chinese (Simplified)": "你能帮我总结一下吗?", + "Spanish": "¿Puedes resumirlo para mí?", + "Hindi": "क्या आप इसे मेरे लिए सारांशित कर सकते हैं?", + "Arabic": "هل يمكنك تلخيصها لي؟", + "Portuguese": "Você pode resumir para mim?", + "Bengali": "আপনি আমার জন্য এটা সংক্ষিপ্ত করতে পারেন?", + "Russian": "Можете ли вы подвести итог для меня?", + "Japanese": "要約してもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੇਰੇ ਲਈ ਇਸਦਾ ਸਾਰ ਦੇ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa ngringkes kanggo kula?", + "Korean": "요약해주실 수 있나요?", + "French": "Pouvez-vous me le résumer ?", + "German": "Können Sie es für mich zusammenfassen?" + }, + { + "English": "What are the key points?", + "sceneType": "Study", + "Chinese (Simplified)": "要点是什么?", + "Spanish": "¿Cuál es el punto de?", + "Hindi": "क्या बात है?", + "Arabic": "ما هي النقطة؟", + "Portuguese": "Qual é o objetivo?", + "Bengali": "আলোচ্য বিষয়টি কি?", + "Russian": "В чем смысл?", + "Japanese": "ポイントは何ですか?", + "Punjabi": "ਕੀ ਗੱਲ ਹੈ?", + "Javanese": "Apa gunane?", + "Korean": "점은 무엇인가?", + "French": "À quoi ça sert?", + "German": "Was ist der Punkt?" + }, + { + "English": "I need to prepare for the exam", + "sceneType": "Study", + "Chinese (Simplified)": "我需要准备考试", + "Spanish": "necesito prepararme para un examen", + "Hindi": "मुझे एक परीक्षा की तैयारी करनी है", + "Arabic": "أحتاج للتحضير للامتحان", + "Portuguese": "Preciso me preparar para um exame", + "Bengali": "আমাকে একটি পরীক্ষার জন্য প্রস্তুত করতে হবে", + "Russian": "мне нужно подготовиться к экзамену", + "Japanese": "試験の準備をする必要があります", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਇਮਤਿਹਾਨ ਦੀ ਤਿਆਰੀ ਕਰਨ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku kudu nyiapake ujian", + "Korean": "시험 준비를 해야 해요", + "French": "Je dois me préparer à un examen", + "German": "Ich muss mich auf eine Prüfung vorbereiten" + }, + { + "English": "Can you quiz me?", + "sceneType": "Study", + "Chinese (Simplified)": "你能考我吗?", + "Spanish": "¿Puedes probarme?", + "Hindi": "क्या आप मेरा परीक्षण कर सकते हैं?", + "Arabic": "هل يمكنك اختبار لي؟", + "Portuguese": "Você pode me testar?", + "Bengali": "আপনি আমাকে পরীক্ষা করতে পারেন?", + "Russian": "Можешь меня проверить?", + "Japanese": "私をテストしてもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੈਨੂੰ ਪਰਖ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa nyoba aku?", + "Korean": "나를 시험해 볼 수 있나요?", + "French": "Pouvez-vous me tester ?", + "German": "Kannst du mich testen?" + }, + { + "English": "What is the formula?", + "sceneType": "Study", + "Chinese (Simplified)": "公式是什么?", + "Spanish": "¿Cuál es la fórmula?", + "Hindi": "फार्मूला क्या है?", + "Arabic": "ما هي الصيغة؟", + "Portuguese": "Qual é a fórmula?", + "Bengali": "সূত্র কি?", + "Russian": "Какова формула?", + "Japanese": "式とは何ですか?", + "Punjabi": "ਫਾਰਮੂਲਾ ਕੀ ਹੈ?", + "Javanese": "Apa rumus?", + "Korean": "공식은 무엇입니까?", + "French": "Quelle est la formule ?", + "German": "Wie lautet die Formel?" + }, + { + "English": "I need to improve my grades", + "sceneType": "Study", + "Chinese (Simplified)": "我需要提高成绩", + "Spanish": "necesito mejorar mis calificaciones", + "Hindi": "मुझे अपने ग्रेड सुधारने की जरूरत है", + "Arabic": "أحتاج إلى تحسين درجاتي", + "Portuguese": "Preciso melhorar minhas notas", + "Bengali": "আমার গ্রেড উন্নত করতে হবে", + "Russian": "Мне нужно улучшить свои оценки", + "Japanese": "成績を上げる必要がある", + "Punjabi": "ਮੈਨੂੰ ਆਪਣੇ ਗ੍ਰੇਡ ਸੁਧਾਰਨ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku kudu nambah biji", + "Korean": "성적을 높여야 해요", + "French": "Je dois améliorer mes notes", + "German": "Ich muss meine Noten verbessern" + }, + { + "English": "Can I see your homework?", + "sceneType": "Study", + "Chinese (Simplified)": "我可以看看你的作业吗?", + "Spanish": "¿Puedo ver tu tarea?", + "Hindi": "क्या मैं आपका होमवर्क देख सकता हूँ?", + "Arabic": "هل يمكنني رؤية واجباتك المنزلية؟", + "Portuguese": "Posso ver seu dever de casa?", + "Bengali": "আমি কি আপনার বাড়ির কাজ দেখতে পারি?", + "Russian": "Могу ли я увидеть твое домашнее задание?", + "Japanese": "宿題を見てもらえますか?", + "Punjabi": "ਕੀ ਮੈਂ ਤੁਹਾਡਾ ਹੋਮਵਰਕ ਦੇਖ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa ndeleng PR sampeyan?", + "Korean": "숙제 좀 볼 수 있을까요?", + "French": "Puis-je voir tes devoirs ?", + "German": "Kann ich deine Hausaufgaben sehen?" + }, + { + "English": "What did we learn today?", + "sceneType": "Study", + "Chinese (Simplified)": "我们今天学了什么?", + "Spanish": "¿Qué aprendimos hoy?", + "Hindi": "आज हमने क्या सीखा?", + "Arabic": "ماذا تعلمنا اليوم؟", + "Portuguese": "O que aprendemos hoje?", + "Bengali": "আমরা আজ কি শিখলাম?", + "Russian": "Что мы узнали сегодня?", + "Japanese": "今日私たちは何を学びましたか?", + "Punjabi": "ਅੱਜ ਅਸੀਂ ਕੀ ਸਿੱਖਿਆ?", + "Javanese": "Apa sing kita sinau dina iki?", + "Korean": "오늘 우리는 무엇을 배웠나요?", + "French": "Qu’avons-nous appris aujourd’hui ?", + "German": "Was haben wir heute gelernt?" + }, + { + "English": "I need to understand this better", + "sceneType": "Study", + "Chinese (Simplified)": "我需要更好地理解这个", + "Spanish": "Necesito entender esto mejor", + "Hindi": "मुझे इसे बेहतर ढंग से समझने की जरूरत है", + "Arabic": "أحتاج إلى فهم هذا بشكل أفضل", + "Portuguese": "preciso entender isso melhor", + "Bengali": "আমার এটা আরও ভালোভাবে বুঝতে হবে", + "Russian": "мне нужно это лучше понять", + "Japanese": "これをもっと理解する必要があります", + "Punjabi": "ਮੈਨੂੰ ਇਸ ਨੂੰ ਬਿਹਤਰ ਸਮਝਣ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku kudu luwih ngerti iki", + "Korean": "나는 이것을 더 잘 이해해야 한다", + "French": "J'ai besoin de mieux comprendre ça", + "German": "Ich muss das besser verstehen" + }, + { + "English": "Can you explain the instructions?", + "sceneType": "Study", + "Chinese (Simplified)": "你能解释一下这些指示吗?", + "Spanish": "¿Puedes explicar estas instrucciones?", + "Hindi": "क्या आप इन निर्देशों की व्याख्या कर सकते हैं?", + "Arabic": "هل يمكنك شرح هذه التعليمات؟", + "Portuguese": "Você pode explicar essas instruções?", + "Bengali": "আপনি এই নির্দেশাবলী ব্যাখ্যা করতে পারেন?", + "Russian": "Можете ли вы объяснить эти инструкции?", + "Japanese": "これらの指示を説明していただけますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਇਹਨਾਂ ਹਦਾਇਤਾਂ ਦੀ ਵਿਆਖਿਆ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa nerangake instruksi kasebut?", + "Korean": "이 지침을 설명해 주실 수 있나요?", + "French": "Pouvez-vous expliquer ces instructions?", + "German": "Können Sie diese Anweisungen erklären?" + }, + { + "English": "What time does class end?", + "sceneType": "Study", + "Chinese (Simplified)": "课几点结束?", + "Spanish": "¿A qué hora termina la clase?", + "Hindi": "कक्षा कितने बजे समाप्त होती है?", + "Arabic": "في أي وقت ينتهي الفصل؟", + "Portuguese": "A que horas termina a aula?", + "Bengali": "ক্লাস কয়টায় শেষ হয়?", + "Russian": "Во сколько урок заканчивается?", + "Japanese": "授業は何時に終わりますか?", + "Punjabi": "ਕਲਾਸ ਕਿੰਨੇ ਵਜੇ ਖਤਮ ਹੁੰਦੀ ਹੈ?", + "Javanese": "Jam pira kelas rampung?", + "Korean": "수업은 몇시에 끝나나요?", + "French": "À quelle heure se termine le cours ?" + }, + { + "English": "I need to take a break from studying", + "sceneType": "Study", + "Chinese (Simplified)": "我需要休息一下", + "Spanish": "necesito un descanso", + "Hindi": "मुझे एक ब्रेक की जरूरत है", + "Arabic": "أحتاج استراحة", + "Portuguese": "Eu preciso de um tempo", + "Bengali": "আমার একটা বিরতি দরকার", + "Russian": "мне нужен перерыв", + "Japanese": "一休みしたい", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਬ੍ਰੇਕ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku butuh istirahat", + "Korean": "나는 쉬는 시간이 필요합니다", + "French": "j'ai besoin d'une pause", + "German": "ich brauche eine Pause" + } + ] + }, + { + "sceneSource": "Shopping", + "sceneType": "Shopping", + "sceneList": [ + { + "English": "How much is this?", + "sceneType": "Shopping", + "Chinese (Simplified)": "这个多少钱?", + "Spanish": "¿Cuánto cuesta este?", + "Hindi": "यह कितने का है?", + "Arabic": "كم ثمن هذا؟", + "Portuguese": "quanto é este?", + "Bengali": "এটা কত?", + "Russian": "сколько это стоит?", + "Punjabi": "ਇਹ ਕਿੰਨਾ ਹੈ?", + "Javanese": "pira iki?", + "Korean": "이거 얼마예요?", + "French": "combien ça coûte?", + "German": "wieviel kostet das?" + }, + { + "English": "Do you have this in a different size?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们有不同尺寸的吗?", + "Spanish": "¿Tienes diferentes tamaños?", + "Hindi": "क्या आपके पास अलग-अलग आकार हैं?", + "Arabic": "هل لديك أحجام مختلفة؟", + "Portuguese": "Você tem tamanhos diferentes?", + "Bengali": "আপনি বিভিন্ন মাপ আছে?", + "Russian": "У вас есть разные размеры?", + "Japanese": "さまざまなサイズがありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਵੱਖ-ਵੱਖ ਆਕਾਰ ਹਨ?", + "Javanese": "Apa sampeyan duwe ukuran sing beda-beda?", + "Korean": "다양한 사이즈가 있나요?", + "French": "Avez-vous différentes tailles ?", + "German": "Haben Sie verschiedene Größen?" + }, + { + "English": "Where is the fitting room?", + "sceneType": "Shopping", + "Chinese (Simplified)": "试衣间在哪里?", + "Spanish": "¿Dónde está el probador?", + "Hindi": "फिटिंग रूम कहाँ है?", + "Arabic": "أين غرفة القياس؟", + "Portuguese": "Onde fica o provador?", + "Bengali": "ফিটিং রুম কোথায়?", + "Russian": "Где примерочная?", + "Japanese": "試着室はどこですか?", + "Punjabi": "ਫਿਟਿੰਗ ਰੂਮ ਕਿੱਥੇ ਹੈ?", + "Javanese": "Ing endi kamar pas?", + "Korean": "피팅룸은 어디에 있나요?", + "French": "Où est la cabine d'essayage?" + }, + { + "English": "I want to buy this", + "sceneType": "Shopping", + "Chinese (Simplified)": "我想买这个", + "Spanish": "Quiero comprar esto", + "Hindi": "मैं इसे खरीदना चाहता हूं", + "Arabic": "اريد شراء هذا", + "Portuguese": "Eu quero comprar este", + "Bengali": "আমি এই কিনতে চাই", + "Russian": "Я хочу купить это", + "Japanese": "私はこれを買いたい", + "Punjabi": "ਮੈਂ ਇਸਨੂੰ ਖਰੀਦਣਾ ਚਾਹੁੰਦਾ ਹਾਂ", + "Javanese": "Aku arep tuku iki", + "Korean": "나는 이것을 사고 싶다", + "French": "je veux acheter ça", + "German": "ich möchte das kaufen" + }, + { + "English": "Can I pay by credit card?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以用信用卡支付吗?", + "Spanish": "¿Puedo pagar con tarjeta de crédito?", + "Hindi": "क्या मै तुम्हारे क्रेडिट कार्ड का भूकतान कर सकता हूँ?", + "Arabic": "هل استطيع الدفع بواسطة بطاقة ائتمان؟", + "Portuguese": "Posso pagar com cartão de crédito?", + "Bengali": "আমি কি ক্রেডিট কার্ড এর মাধ্যমে বিল পরিশোধ করতে পারি?", + "Russian": "Могу я заплатить кредитной картой?", + "Japanese": "クレジットカードで支払うことはできますか?", + "Punjabi": "ਕੀ ਮੈਂ ਕ੍ਰੈਡਿਟ ਕਾਰਡ ਦੁਆਰਾ ਭੁਗਤਾਨ ਕਰ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Bisa mbayar nganggo kertu kredit?", + "Korean": "카드로 결제 할 수 있나요?", + "French": "Puis-je payer par carte de crédit?", + "German": "Kann ich mit Kreditkarte bezahlen?" + }, + { + "English": "Do you have any discounts?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们有折扣吗?", + "Spanish": "¿Tiene algún descuento?", + "Hindi": "क्या आपके पास कोई छूट है?", + "Arabic": "هل لديك أي خصومات؟", + "Portuguese": "Você tem algum desconto?", + "Bengali": "আপনি কোন ডিসকাউন্ট আছে?", + "Russian": "Есть ли у вас скидки?", + "Japanese": "割引はありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਛੋਟ ਹੈ?", + "Javanese": "Apa sampeyan duwe diskon?", + "Korean": "할인이 있나요?", + "French": "Avez-vous des réductions ?", + "German": "Gibt es Rabatte?" + }, + { + "English": "Can I return this?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以退货吗?", + "Spanish": "¿Puedo devolverlo?", + "Hindi": "क्या मैं इसे वापस कर सकता हूँ?", + "Arabic": "هل يمكنني إعادته؟", + "Portuguese": "Posso devolvê-lo?", + "Bengali": "আমি কি এটা ফেরত দিতে পারি?", + "Russian": "Могу ли я вернуть его?", + "Japanese": "返品できますか?", + "Punjabi": "ਕੀ ਮੈਂ ਇਸਨੂੰ ਵਾਪਸ ਕਰ ਸਕਦਾ\/ਸਕਦੀ ਹਾਂ?", + "Javanese": "Apa aku bisa mbalekake?", + "Korean": "반품할 수 있나요?", + "French": "Puis-je le retourner ?", + "German": "Kann ich es zurückgeben?" + }, + { + "English": "Is this on sale?", + "sceneType": "Shopping", + "Chinese (Simplified)": "这个在打折吗?", + "Spanish": "¿Está esto en oferta?", + "Hindi": "क्या यह बिक्री पर है?", + "Arabic": "هل هذا للبيع؟", + "Portuguese": "Isso está à venda?", + "Bengali": "এটা কি বিক্রি হচ্ছে?", + "Russian": "Это в продаже?", + "Japanese": "これは販売されていますか?", + "Punjabi": "ਕੀ ਇਹ ਵਿਕਰੀ 'ਤੇ ਹੈ?", + "Javanese": "Apa iki didol?", + "Korean": "이거 판매 중인가요?", + "French": "Est-ce en vente ?", + "German": "Ist das im Angebot?" + }, + { + "English": "Can I get a receipt?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以要收据吗?", + "Spanish": "¿Puedes darme un recibo?", + "Arabic": "هل يمكنني الحصول على إيصال؟", + "Portuguese": "Posso ter um recibo?", + "Bengali": "আমি কি একটি রসিদ পেতে পারি?", + "Russian": "Могу я получить квитанцию?", + "Japanese": "領収書もらえます?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਕ ਰਸੀਦ ਲੈ ਸਕਦਾ ਹਾ?", + "Javanese": "Apa aku bisa duwe kuitansi?", + "Korean": "영수증을 받을 수 있나요?", + "French": "Puis-je avoir un reçu?", + "German": "Kann ich den Rezept haben?" + }, + { + "English": "Do you offer a warranty?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们提供保修吗?", + "Spanish": "¿Ofreces una garantía?", + "Hindi": "क्या आप वारंटी देते हैं?", + "Arabic": "هل تقدمون الضمان؟", + "Portuguese": "Você oferece uma garantia?", + "Bengali": "আপনি একটি ওয়ারেন্টি অফার করেন?", + "Russian": "Вы предлагаете гарантию?", + "Japanese": "保証はありますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਵਾਰੰਟੀ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰਦੇ ਹੋ?", + "Javanese": "Apa sampeyan menehi garansi?", + "Korean": "보증을 제공합니까?", + "French": "Est-ce que vous offrez une garantie?", + "German": "Bieten Sie eine Garantie an?" + }, + { + "English": "Can I try this on?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以试穿这个吗?", + "Spanish": "¿Puedo probarme esto?", + "Hindi": "क्या इसे मैं भी कोशिश करूँ?", + "Arabic": "هل يمكنني تجربة هذا؟", + "Portuguese": "Posso tentar isto?", + "Bengali": "আমি কি এই চেষ্টা করতে পারি?", + "Russian": "Могу ли я примерить это?", + "Japanese": "これを試着してもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਇਸ 'ਤੇ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa nyoba iki?", + "Korean": "이걸 입어봐도 될까요?", + "French": "Est-ce que je peux l'essayer?", + "German": "Kann ich das anprobieren?" + }, + { + "English": "What is your return policy?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们的退货政策是什么?", + "Spanish": "¿Cuál es su política de devolución?", + "Hindi": "आपकी वापसी नीति क्या है?", + "Arabic": "ما هي خلفيتك السياسية؟", + "Portuguese": "Qual é a sua política de devolução?", + "Bengali": "আপনার ফিরতি নীতি কি?", + "Russian": "Какова Ваша политика возврата?", + "Japanese": "返品ポリシーは何ですか?", + "Punjabi": "ਤੁਹਾਡੀ ਵਾਪਸੀ ਨੀਤੀ ਕੀ ਹੈ?", + "Javanese": "Apa kebijakan bali sampeyan?", + "Korean": "반품 정책은 무엇입니까?", + "French": "Quelle est votre politique de retour ?", + "German": "Wie lauten Ihre Rückgabebedingungen?" + }, + { + "English": "Is there a sale today?", + "sceneType": "Shopping", + "Chinese (Simplified)": "今天有促销吗?", + "Spanish": "¿Hay alguna promoción hoy?", + "Hindi": "क्या आज कोई प्रमोशन है?", + "Portuguese": "Tem alguma promoção hoje?", + "Bengali": "আজ কোন প্রচার আছে?", + "Russian": "Есть ли сегодня акции?", + "Japanese": "今日は何かプロモーションがありますか?", + "Punjabi": "ਕੀ ਅੱਜ ਕੋਈ ਤਰੱਕੀਆਂ ਹਨ?", + "Javanese": "Apa ana promosi dina iki?", + "Korean": "오늘 프로모션이 있나요?", + "French": "Y a-t-il des promotions aujourd'hui ?", + "German": "Gibt es heute Sonderangebote?" + }, + { + "English": "Do you have a loyalty program?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们有会员计划吗?", + "Spanish": "¿Tiene un programa de membresía?", + "Hindi": "क्या आपके पास कोई सदस्यता कार्यक्रम है?", + "Arabic": "هل لديك برنامج العضوية؟", + "Portuguese": "Você tem um programa de adesão?", + "Bengali": "আপনি একটি সদস্যতা প্রোগ্রাম আছে?", + "Russian": "Есть ли у вас членская программа?", + "Japanese": "会員プログラムはありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਮੈਂਬਰਸ਼ਿਪ ਪ੍ਰੋਗਰਾਮ ਹੈ?", + "Javanese": "Apa sampeyan duwe program anggota?", + "Korean": "멤버십 프로그램이 있나요?", + "French": "Avez-vous un programme d'adhésion?" + }, + { + "English": "Can you gift wrap this?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你能把这个包装成礼物吗?", + "Spanish": "¿Puedes envolver esto como regalo?", + "Hindi": "क्या आप इसे उपहार के रूप में लपेट सकते हैं?", + "Arabic": "هل يمكنك تغليف هذا كهدية؟", + "Portuguese": "Você pode embrulhar isso como um presente?", + "Bengali": "আপনি একটি উপহার হিসাবে এটি মোড়ানো করতে পারেন?", + "Russian": "Можете ли вы упаковать это как подарок?", + "Japanese": "これをプレゼントとして包装してもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਇਸ ਨੂੰ ਤੋਹਫ਼ੇ ਵਜੋਂ ਲਪੇਟ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa mbungkus iki minangka hadiah?", + "Korean": "이것을 선물로 포장해 주실 수 있나요?", + "French": "Pouvez-vous emballer ceci comme cadeau ?", + "German": "Kann man das als Geschenk verpacken?" + }, + { + "English": "I'm just browsing", + "sceneType": "Shopping", + "Chinese (Simplified)": "我只是随便看看", + "Spanish": "solo estoy mirando encallado", + "Hindi": "मैं बस इधर-उधर देख रहा हूं", + "Arabic": "أنا فقط أبحث عن جنوح", + "Portuguese": "Estou apenas olhando encalhado", + "Bengali": "আমি শুধু চারদিকে তাকিয়ে আছি", + "Russian": "я просто смотрю на мель", + "Japanese": "ただ座礁しているだけだ", + "Punjabi": "ਮੈਂ ਸਿਰਫ਼ ਆਲੇ-ਦੁਆਲੇ ਦੇਖ ਰਿਹਾ ਹਾਂ", + "Javanese": "Aku mung nyawang karam", + "Korean": "난 그냥 둘러보고 있는 중이야", + "French": "je regarde juste par terre", + "German": "Ich sehe einfach aus wie gestrandet" + }, + { + "English": "Do you have this in stock?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们有现货吗?", + "Spanish": "¿Tiene en existencia?", + "Hindi": "क्या आपके पास स्टॉक में है?", + "Arabic": "هل لديك في الأوراق المالية؟", + "Portuguese": "Você tem em estoque?", + "Bengali": "আপনি স্টক আছে?", + "Russian": "Есть ли у вас в наличии?", + "Japanese": "在庫はありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਸਟਾਕ ਵਿੱਚ ਹੈ?", + "Javanese": "Apa sampeyan duwe saham?", + "Korean": "재고가 있나요?", + "French": "Avez-vous en stock?", + "German": "Haben Sie auf Lager?" + }, + { + "English": "Can you hold this for me?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你能帮我留一下这个吗?", + "Spanish": "¿Puedes guardar esto para mí?", + "Hindi": "क्या आप इसे मेरे लिए बचा सकते हैं?", + "Arabic": "هل يمكنك حفظ هذا بالنسبة لي؟", + "Portuguese": "Você pode guardar isso para mim?", + "Bengali": "আপনি কি আমার জন্য এটি সংরক্ষণ করতে পারেন?", + "Russian": "Можешь сохранить это для меня?", + "Japanese": "これを保存してもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਇਸ ਨੂੰ ਮੇਰੇ ਲਈ ਬਚਾ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa nyimpen iki kanggo kula?", + "Korean": "이것을 저장해 주실 수 있나요?", + "French": "Tu peux garder ça pour moi ?", + "German": "Kannst du das für mich speichern?" + }, + { + "English": "What is the price?", + "sceneType": "Shopping", + "Chinese (Simplified)": "价格是多少?", + "Spanish": "¿Cuál es el precio?", + "Hindi": "कीमत क्या है?", + "Arabic": "ماهو السعر؟", + "Bengali": "মূল্য কি?", + "Russian": "какова цена?", + "Japanese": "いくらですか?", + "Punjabi": "ਕੀਮਤ ਕੀ ਹੈ?", + "Javanese": "pira regane?", + "Korean": "가격은 얼마입니까?", + "French": "quel est le prix?", + "German": "was ist der Preis?" + }, + { + "English": "Can I get a bag?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以要一个袋子吗?", + "Spanish": "¿Puedo tener una bolsa?", + "Hindi": "क्या मुझे एक बैग मिल सकता है?", + "Arabic": "هل يمكنني الحصول على حقيبة؟", + "Portuguese": "Posso pegar uma bolsa?", + "Bengali": "আমি কি একটি ব্যাগ পেতে পারি?", + "Russian": "Можно мне сумку?", + "Japanese": "バッグをもらえますか?", + "Punjabi": "ਕੀ ਮੇਰੇ ਕੋਲ ਬੈਗ ਹੈ?", + "Javanese": "Apa aku bisa duwe tas?", + "Korean": "가방 하나 가질 수 있나요?", + "French": "Puis-je avoir un sac ?", + "German": "Kann ich eine Tasche haben?" + }, + { + "English": "Is this the final price?", + "sceneType": "Shopping", + "Chinese (Simplified)": "这是最终价格吗?", + "Spanish": "¿Este es el precio final?", + "Hindi": "क्या यह अंतिम कीमत है?", + "Arabic": "هل هذا هو السعر النهائي ؟", + "Portuguese": "Este é o preço final?", + "Bengali": "এটাই কি চূড়ান্ত দাম?", + "Russian": "Это окончательная цена?", + "Japanese": "これが最終価格ですか?", + "Punjabi": "ਕੀ ਇਹ ਅੰਤਿਮ ਕੀਮਤ ਹੈ?", + "Javanese": "Apa iki rega pungkasan?", + "Korean": "이게 최종가격인가요?", + "French": "Est-ce le prix final ?", + "German": "Ist das der Endpreis?" + }, + { + "English": "Do you accept cash?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们接受现金吗?", + "Spanish": "¿Aceptas efectivo?", + "Hindi": "क्या आप नकद स्वीकार करते हैं?", + "Arabic": "هل تقبل النقد؟", + "Portuguese": "Você aceita dinheiro?", + "Bengali": "আপনি নগদ গ্রহণ করেন?", + "Russian": "Вы принимаете наличные?", + "Japanese": "現金は使えますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਨਕਦ ਸਵੀਕਾਰ ਕਰਦੇ ਹੋ?", + "Javanese": "Apa sampeyan nampa dhuwit?", + "Korean": "현금을 받나요?", + "French": "Acceptez-vous les espèces ?", + "German": "Akzeptieren Sie Bargeld?" + }, + { + "English": "Can you help me find this item?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你能帮我找到这个商品吗?", + "Spanish": "¿Puedes ayudarme a encontrar este producto?", + "Hindi": "क्या आप इस उत्पाद को ढूंढने में मेरी मदद कर सकते हैं?", + "Arabic": "هل يمكنك مساعدتي في العثور على هذا المنتج؟", + "Portuguese": "Você pode me ajudar a encontrar este produto?", + "Russian": "Можете ли вы помочь мне найти этот продукт?", + "Japanese": "この商品を探すのを手伝ってもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਇਸ ਉਤਪਾਦ ਨੂੰ ਲੱਭਣ ਵਿੱਚ ਮੇਰੀ ਮਦਦ ਕਰ ਸਕਦੇ ਹੋ?", + "Korean": "이 제품을 찾는 데 도움을 주실 수 있나요?", + "French": "Pouvez-vous m'aider à trouver ce produit ?", + "German": "Können Sie mir helfen, dieses Produkt zu finden?" + }, + { + "English": "Is there a fitting room?", + "sceneType": "Shopping", + "Chinese (Simplified)": "有试衣间吗?", + "Spanish": "¿Hay un probador?", + "Hindi": "क्या कोई फिटिंग रूम है?", + "Arabic": "هل هناك غرفة القياس؟", + "Portuguese": "Existe provador?", + "Bengali": "একটি ফিটিং রুম আছে?", + "Russian": "Есть ли примерочная?", + "Japanese": "試着室はありますか?", + "Punjabi": "ਕੀ ਕੋਈ ਫਿਟਿੰਗ ਰੂਮ ਹੈ?", + "Javanese": "Apa ana kamar pas?", + "Korean": "피팅룸이 있나요?", + "French": "Y a-t-il une cabine d'essayage ?", + "German": "Gibt es eine Umkleidekabine?" + }, + { + "English": "Can I exchange this?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以换货吗?", + "Spanish": "¿Puedo cambiar el artículo?", + "Hindi": "क्या मैं वस्तु का आदान-प्रदान कर सकता हूँ?", + "Arabic": "هل يمكنني استبدال السلعة؟", + "Portuguese": "Posso trocar o item?", + "Bengali": "আমি কি আইটেম বিনিময় করতে পারি?", + "Russian": "Могу ли я обменять товар?", + "Japanese": "商品の交換はできますか?", + "Punjabi": "ਕੀ ਮੈਂ ਆਈਟਮ ਨੂੰ ਬਦਲ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa ngganti barang kasebut?", + "Korean": "상품을 교환할 수 있나요?", + "French": "Puis-je échanger l'article ?", + "German": "Kann ich den Artikel umtauschen?" + }, + { + "English": "Do you have any promotions?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们有促销活动吗?", + "Spanish": "¿Tienes alguna promoción?", + "Hindi": "क्या आपके पास कोई प्रमोशन है?", + "Arabic": "هل لديك أي عروض ترويجية؟", + "Portuguese": "Você tem alguma promoção?", + "Bengali": "আপনি কোন প্রচার আছে?", + "Russian": "Есть ли у вас какие-либо акции?", + "Japanese": "何かプロモーションはありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਤਰੱਕੀਆਂ ਹਨ?", + "Javanese": "Apa sampeyan duwe promosi?", + "Korean": "프로모션이 있나요?", + "French": "Avez-vous des promotions ?", + "German": "Gibt es Sonderangebote?" + }, + { + "English": "Can I see that item?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以看看那个商品吗?", + "Spanish": "¿Puedo ver ese artículo?", + "Hindi": "क्या मैं वह वस्तु देख सकता हूँ?", + "Arabic": "هل يمكنني رؤية هذا العنصر؟", + "Portuguese": "Posso ver esse item?", + "Bengali": "আমি যে আইটেম দেখতে পারি?", + "Russian": "Могу ли я увидеть этот предмет?", + "Japanese": "そのアイテムを見ることはできますか?", + "Punjabi": "ਕੀ ਮੈਂ ਉਹ ਚੀਜ਼ ਦੇਖ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa ndeleng item kasebut?", + "Korean": "그 항목을 볼 수 있나요?", + "French": "Puis-je voir cet objet ?", + "German": "Kann ich diesen Artikel sehen?" + }, + { + "English": "What colors do you have?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们有什么颜色?", + "Spanish": "¿Qué colores tienes?", + "Hindi": "आपके पास कौन से रंग हैं?", + "Arabic": "ما هي الألوان التي لديك؟", + "Portuguese": "Quais cores você tem?", + "Bengali": "আপনি কি রং আছে?", + "Russian": "Какие цвета у вас есть?", + "Japanese": "何色がありますか?", + "Punjabi": "ਤੁਹਾਡੇ ਕੋਲ ਕਿਹੜੇ ਰੰਗ ਹਨ?", + "Javanese": "Apa warna sampeyan duwe?", + "Korean": "어떤 색상이 있나요?", + "French": "Quelles couleurs as-tu ?", + "German": "Welche Farben hast du?" + }, + { + "English": "Do you offer free shipping?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们提供免费送货吗?", + "Spanish": "¿Ofrecen envío gratuito?", + "Hindi": "क्या आप मुफ़्त शिपिंग की पेशकश करते हैं?", + "Arabic": "هل تقدم الشحن المجاني؟", + "Portuguese": "Você oferece frete grátis?", + "Bengali": "আপনি কি বিনামূল্যে শিপিং অফার করেন?", + "Russian": "Вы предлагаете бесплатную доставку?", + "Japanese": "送料無料はありますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੁਫਤ ਸ਼ਿਪਿੰਗ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰਦੇ ਹੋ?", + "Javanese": "Apa sampeyan nawakake pengiriman gratis?", + "Korean": "무료 배송을 제공하나요?", + "French": "Offrez-vous la livraison gratuite ?", + "German": "Bieten Sie kostenlosen Versand an?" + }, + { + "English": "Can I get a discount?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以打折吗?", + "Spanish": "¿Puedo obtener un descuento?", + "Hindi": "क्या मुझे छूट मिल सकती है?", + "Arabic": "هل يمكنني الحصول على خصم؟", + "Portuguese": "Posso obter um desconto?", + "Bengali": "আমি কি ডিসকাউন্ট পেতে পারি?", + "Russian": "Могу ли я получить скидку?", + "Japanese": "割引は受けられますか?", + "Punjabi": "ਕੀ ਮੈਨੂੰ ਛੋਟ ਮਿਲ ਸਕਦੀ ਹੈ?", + "Javanese": "Apa aku bisa njaluk diskon?", + "Korean": "할인을 받을 수 있나요?", + "French": "Puis-je bénéficier d'une réduction ?", + "German": "Kann ich einen Rabatt bekommen?" + }, + { + "English": "How long is the warranty?", + "sceneType": "Shopping", + "Chinese (Simplified)": "保修期是多长?", + "Spanish": "¿Cuánto dura el período de garantía?", + "Hindi": "वारंटी अवधि कब तक है?", + "Arabic": "كم هي فترة الضمان ؟", + "Portuguese": "Quanto tempo dura o período de garantia?", + "Bengali": "ওয়ারেন্টি সময়কাল কতক্ষণ?", + "Russian": "Как долго длится гарантийный срок?", + "Japanese": "保証期間はどれくらいですか?", + "Punjabi": "ਵਾਰੰਟੀ ਦੀ ਮਿਆਦ ਕਿੰਨੀ ਦੇਰ ਹੈ?", + "Javanese": "Suwene wektu babar pisan?", + "Korean": "보증 기간은 얼마나 되나요?", + "French": "Quelle est la durée de la période de garantie ?", + "German": "Wie lange ist die Garantiezeit?" + }, + { + "English": "Can I get a refund?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以退款吗?", + "Spanish": "¿Puedo obtener un reembolso?", + "Hindi": "क्या मुझे धनवापसी प्राप्त हो सकती है?", + "Arabic": "هل يمكنني الحصول على استرداد؟", + "Portuguese": "Posso obter um reembolso?", + "Bengali": "আমি কি ফেরত পেতে পারি?", + "Russian": "Могу ли я получить возмещение?", + "Japanese": "返金してもらえますか?", + "Punjabi": "ਕੀ ਮੈਨੂੰ ਰਿਫੰਡ ਮਿਲ ਸਕਦਾ ਹੈ?", + "Javanese": "Bisa njaluk mbalekaken?", + "Korean": "환불받을 수 있나요?", + "French": "Puis-je obtenir un remboursement ?", + "German": "Kann ich eine Rückerstattung erhalten?" + }, + { + "English": "Is this available online?", + "sceneType": "Shopping", + "Chinese (Simplified)": "这个在线有卖吗?", + "Spanish": "¿Está esto disponible para la venta en línea?", + "Hindi": "क्या यह ऑनलाइन बिक्री के लिए उपलब्ध है?", + "Arabic": "هل هذا متاح للبيع عبر الإنترنت؟", + "Portuguese": "Isso está disponível para venda online?", + "Bengali": "এটি কি অনলাইনে বিক্রয়ের জন্য উপলব্ধ?", + "Russian": "Это доступно для продажи онлайн?", + "Japanese": "これはオンラインで販売できますか?", + "Punjabi": "ਕੀ ਇਹ ਆਨਲਾਈਨ ਵਿਕਰੀ ਲਈ ਉਪਲਬਧ ਹੈ?", + "Javanese": "Apa iki kasedhiya kanggo didol online?", + "Korean": "이거 온라인 판매 가능한가요?", + "French": "Est-ce disponible à la vente en ligne ?", + "German": "Ist das online zum Verkauf verfügbar?" + }, + { + "English": "Do you have any coupons?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们有优惠券吗?", + "Spanish": "¿Tiene algún cupón?", + "Hindi": "क्या आप के पास कोई कूपन हैं?", + "Arabic": "هل لديك أي كوبونات؟", + "Portuguese": "Você tem cupons?", + "Bengali": "আপনার কাছে কোন কুপন আছে?", + "Russian": "У вас есть купоны?", + "Japanese": "クーポンはありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਕੂਪਨ ਹਨ?", + "Javanese": "Apa sampeyan duwe kupon?", + "Korean": "쿠폰이 있나요?", + "French": "avez-vous des coupons?", + "German": "Gibt es Gutscheine?" + }, + { + "English": "Can I use this coupon?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以用这个优惠券吗?", + "Spanish": "¿Puedo usar este cupón?", + "Hindi": "क्या मैं इस कूपन का उपयोग कर सकता हूँ?", + "Arabic": "هل يمكنني استخدام هذه القسيمة؟", + "Portuguese": "Posso usar esse cupom?", + "Bengali": "আমি কি এই কুপন ব্যবহার করতে পারি?", + "Russian": "Могу ли я использовать этот купон?", + "Japanese": "このクーポンは使えますか?", + "Punjabi": "ਕੀ ਮੈਂ ਇਸ ਕੂਪਨ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa nggunakake kupon iki?", + "Korean": "이 쿠폰을 사용할 수 있나요?", + "German": "Kann ich diesen Gutschein verwenden?" + }, + { + "English": "What is your exchange policy?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们的换货政策是什么?", + "Spanish": "¿Cuál es su política cambiaria?", + "Hindi": "आपकी विनिमय नीति क्या है?", + "Arabic": "ما هي سياسة التبادل الخاصة بك؟", + "Portuguese": "Qual é a sua política de troca?", + "Bengali": "আপনার বিনিময় নীতি কি?", + "Russian": "Какова ваша политика обмена?", + "Japanese": "交換ポリシーは何ですか?", + "Punjabi": "ਤੁਹਾਡੀ ਐਕਸਚੇਂਜ ਨੀਤੀ ਕੀ ਹੈ?", + "Javanese": "Apa kebijakan pertukaran sampeyan?", + "Korean": "교환 정책은 무엇입니까?", + "French": "Quelle est votre politique d'échange ?", + "German": "Wie lauten Ihre Umtauschrichtlinien?" + }, + { + "English": "Is this made of leather?", + "sceneType": "Shopping", + "Chinese (Simplified)": "这是皮革做的吗?", + "Spanish": "¿Está hecho de cuero?", + "Hindi": "क्या यह चमड़े से बना है?", + "Arabic": "هل هذا مصنوع من الجلد؟", + "Portuguese": "Isso é feito de couro?", + "Bengali": "এটা কি চামড়া দিয়ে তৈরি?", + "Russian": "Это сделано из кожи?", + "Japanese": "これは革でできていますか?", + "Punjabi": "ਕੀ ਇਹ ਚਮੜੇ ਦਾ ਬਣਿਆ ਹੈ?", + "Javanese": "Apa iki digawe saka kulit?", + "Korean": "이거 가죽으로 만든건가요?", + "French": "Est-ce en cuir ?", + "German": "Ist das aus Leder?" + }, + { + "English": "Do you have this in blue?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们有蓝色的吗?", + "Spanish": "¿Tienes algunos azules?", + "Hindi": "क्या आपके पास कोई नीला है?", + "Arabic": "هل لديك أي منها زرقاء؟", + "Portuguese": "Você tem algum azul?", + "Bengali": "তোমার কি কোন নীল আছে?", + "Russian": "У вас есть синие?", + "Japanese": "青いのはありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਨੀਲਾ ਹੈ?", + "Javanese": "Apa sampeyan duwe sing biru?", + "Korean": "파란색도 있나요?", + "French": "En avez-vous des bleues ?", + "German": "Hast du blaue?" + }, + { + "English": "Can I get a sample?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以要一个样品吗?", + "Spanish": "¿Puedo tener una muestra?", + "Hindi": "क्या मुझे एक नमूना मिल सकता है?", + "Arabic": "هل يمكنني الحصول على عينة؟", + "Portuguese": "Posso ter uma amostra?", + "Bengali": "আমি একটি নমুনা পেতে পারি?", + "Russian": "Могу ли я получить образец?", + "Japanese": "サンプルをもらえますか?", + "Punjabi": "ਕੀ ਮੈਂ ਨਮੂਨਾ ਲੈ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa duwe sampel?", + "Korean": "샘플을 받을 수 있나요?", + "French": "Puis-je avoir un échantillon ?", + "German": "Kann ich eine Probe haben?" + }, + { + "English": "Can you price match?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们可以价格匹配吗?", + "Spanish": "¿Puedes igualar el precio?", + "Hindi": "क्या आप कीमत का मिलान कर सकते हैं?", + "Arabic": "هل يمكنك مطابقة السعر؟", + "Portuguese": "Você pode combinar o preço?", + "Bengali": "আপনি দাম মেলে?", + "Russian": "Можете ли вы сравнить цены?", + "Japanese": "価格合わせはしてもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਕੀਮਤ ਨਾਲ ਮੇਲ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa cocog karo rega?", + "Korean": "가격을 일치시킬 수 있나요?", + "French": "Pouvez-vous égaler les prix ?", + "German": "Können Sie den Preis anpassen?" + }, + { + "English": "Do you offer bulk discounts?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们有批量折扣吗?", + "Spanish": "¿Tienes descuentos por volumen?", + "Hindi": "क्या आपके पास वॉल्यूम छूट है?", + "Arabic": "هل لديكم خصومات على الكميات؟", + "Portuguese": "Você tem descontos por volume?", + "Bengali": "আপনি ভলিউম ডিসকাউন্ট আছে?", + "Russian": "Есть ли у вас скидки за объем?", + "Japanese": "ボリュームディスカウントはありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਵਾਲੀਅਮ ਛੋਟ ਹੈ?", + "Javanese": "Apa sampeyan duwe diskon volume?", + "Korean": "대량 할인이 있나요?", + "French": "Bénéficiez-vous de remises sur volume ?", + "German": "Gibt es Mengenrabatte?" + }, + { + "English": "How do I use this?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我怎么用这个?", + "Spanish": "¿Cómo uso esto?", + "Hindi": "मैं इसका प्रयोग कैसे करूं?", + "Arabic": "كيف يمكنني استخدام هذا؟", + "Portuguese": "Como faço para usar isso?", + "Bengali": "আমি এটা কিভাবে ব্যবহার করব?", + "Russian": "Как мне это использовать?", + "Japanese": "これはどうやって使えばいいのでしょうか?", + "Punjabi": "ਮੈਂ ਇਸਦੀ ਵਰਤੋਂ ਕਿਵੇਂ ਕਰਾਂ?", + "Javanese": "Kepiye carane nggunakake iki?", + "Korean": "이것을 어떻게 사용하나요?", + "French": "Comment puis-je utiliser cela ?", + "German": "Wie verwende ich das?" + }, + { + "English": "Can you deliver this?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们可以送货吗?", + "Spanish": "¿Puedes entregar?", + "Hindi": "क्या आप पहुंचा सकते हैं?", + "Arabic": "يمكنك تقديم؟", + "Portuguese": "Você pode entregar?", + "Bengali": "আপনি বিতরণ করতে পারেন?", + "Russian": "Можете ли вы доставить?", + "Japanese": "配達してもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਡਿਲੀਵਰ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Sampeyan bisa ngirim?", + "Korean": "배달할 수 있나요?", + "French": "Pouvez-vous livrer ?", + "German": "Können Sie liefern?" + }, + { + "English": "Do you have a size chart?", + "sceneType": "Shopping", + "Chinese (Simplified)": "你们有尺寸表吗?", + "Spanish": "¿Tienes una tabla de tallas?", + "Hindi": "क्या आपके पास कोई साइज़ चार्ट है?", + "Arabic": "هل لديك مخطط الحجم؟", + "Portuguese": "Você tem uma tabela de tamanhos?", + "Bengali": "আপনি একটি আকার চার্ট আছে?", + "Russian": "У вас есть таблица размеров?", + "Japanese": "サイズ表はありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਆਕਾਰ ਦਾ ਚਾਰਟ ਹੈ?", + "Javanese": "Apa sampeyan duwe grafik ukuran?", + "Korean": "사이즈 차트가 있나요?", + "French": "Avez-vous un tableau des tailles ?", + "German": "Hast du eine Größentabelle?" + }, + { + "English": "Can I speak to the manager?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以和经理谈吗?", + "Spanish": "¿Puedo hablar con el gerente?", + "Hindi": "क्या मैं मैनेजर से बात कर सकता हूँ?", + "Arabic": "هل يمكنني التحدث مع المدير؟", + "Portuguese": "Posso falar com o gerente?", + "Bengali": "আমি কি ম্যানেজারের সাথে কথা বলতে পারি?", + "Russian": "Могу ли я поговорить с менеджером?", + "Japanese": "マネージャーと話してもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਮੈਨੇਜਰ ਨਾਲ ਗੱਲ ਕਰ ਸਕਦਾ\/ਸਕਦੀ ਹਾਂ?", + "Javanese": "Apa aku bisa ngomong karo manajer?", + "Korean": "매니저와 통화할 수 있나요?", + "French": "Puis-je parler au manager ?", + "German": "Kann ich mit dem Manager sprechen?" + }, + { + "English": "Is this handmade?", + "sceneType": "Shopping", + "Chinese (Simplified)": "这是手工制作的吗?", + "Spanish": "¿Esto es hecho a mano?", + "Hindi": "क्या यह हस्तनिर्मित है?", + "Arabic": "هل هذا مصنوع يدويًا؟", + "Portuguese": "Isso é feito à mão?", + "Bengali": "এটা কি হাতে তৈরি?", + "Russian": "Это ручная работа?", + "Japanese": "これは手作りですか?", + "Punjabi": "ਕੀ ਇਹ ਹੱਥ ਨਾਲ ਬਣਿਆ ਹੈ?", + "Javanese": "Apa iki gawenan tangan?", + "Korean": "이거 수제인가요?", + "French": "Est-ce fait à la main ?", + "German": "Ist das handgefertigt?" + }, + { + "English": "Can I get this customized?", + "sceneType": "Shopping", + "Chinese (Simplified)": "我可以定制这个吗?", + "Spanish": "¿Puedo personalizar esto?", + "Hindi": "क्या मैं इसे अनुकूलित कर सकता हूँ?", + "Arabic": "هل يمكنني تخصيص هذا؟", + "Portuguese": "Posso personalizar isso?", + "Bengali": "আমি এটা কাস্টমাইজ করতে পারি?", + "Russian": "Могу ли я настроить это?", + "Japanese": "これをカスタマイズできますか?", + "Punjabi": "ਕੀ ਮੈਂ ਇਸਨੂੰ ਅਨੁਕੂਲਿਤ ਕਰ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa ngatur iki?", + "Korean": "이것을 맞춤설정할 수 있나요?", + "French": "Puis-je personnaliser cela ?", + "German": "Kann ich das anpassen?" + }, + { + "English": "What is the material?", + "sceneType": "Shopping", + "Chinese (Simplified)": "材料是什么?", + "Spanish": "¿Cuál es el material?", + "Hindi": "सामग्री क्या है?", + "Arabic": "ما هي المادة؟", + "Portuguese": "Qual é o material?", + "Bengali": "উপাদান কি?", + "Russian": "Что такое материал?", + "Japanese": "素材は何ですか?", + "Punjabi": "ਸਮੱਗਰੀ ਕੀ ਹੈ?", + "Javanese": "Apa materi?", + "Korean": "재료는 무엇입니까?", + "French": "Quel est le matériel ?", + "German": "Was ist das Material?" + } + ] + }, + { + "sceneSource": "Healthy", + "sceneType": "Healthy", + "sceneList": [ + { + "English": "I feel sick", + "sceneType": "Healthy", + "Chinese (Simplified)": "我觉得不舒服", + "Spanish": "me siento incomodo", + "Hindi": "मैं असहज महसूस कर रहा हूँ", + "Arabic": "أشعر بعدم الارتياح", + "Portuguese": "Eu me sinto desconfortável", + "Bengali": "আমি অস্বস্তিবোধ করছি", + "Russian": "Я чувствую себя некомфортно", + "Japanese": "気分が悪いです", + "Punjabi": "ਮੈਂ ਅਸਹਿਜ ਮਹਿਸੂਸ ਕਰਦਾ ਹਾਂ", + "Javanese": "Aku rumangsa ora kepenak", + "Korean": "불편하다", + "French": "Je me sens mal à l'aise", + "German": "ich fühle mich unwohl" + }, + { + "English": "I need to see a doctor", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要看医生", + "Spanish": "Necesito ver un doctor", + "Hindi": "मुझे डॉक्टर से मिलना होगा", + "Arabic": "أنا في حاجة لرؤية طبيب", + "Portuguese": "Eu preciso ver um médico", + "Bengali": "আমার ডাক্তার দেখাতে হবে", + "Russian": "мне нужно обратиться к врачу", + "Japanese": "医者に診てもらう必要がある", + "Punjabi": "ਮੈਨੂੰ ਡਾਕਟਰ ਨੂੰ ਮਿਲਣ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku kudu takon dhokter", + "Korean": "의사를 만나야 해요", + "French": "J'ai besoin de voir un médecin", + "German": "Ich muss einen Arzt aufsuchen" + }, + { + "English": "Do you have any medicine?", + "sceneType": "Healthy", + "Chinese (Simplified)": "你有药吗?", + "Spanish": "¿Tiene algún medicamento?", + "Hindi": "क्या आपके पास कोई दवा है?", + "Arabic": "هل لديك أي دواء؟", + "Portuguese": "Você tem algum remédio?", + "Bengali": "তোমার কাছে কোন ওষুধ আছে?", + "Russian": "У вас есть какое-нибудь лекарство?", + "Japanese": "何か薬はありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਦਵਾਈ ਹੈ?", + "Javanese": "Apa sampeyan duwe obat?", + "Korean": "약이 있나요?", + "French": "Avez-vous des médicaments ?", + "German": "Hast du Medikamente?" + }, + { + "English": "I'm allergic to nuts", + "sceneType": "Healthy", + "Chinese (Simplified)": "我对坚果过敏", + "Spanish": "Soy alérgico a las nueces", + "Hindi": "मुझे सुपारी आदि से एलर्जी है", + "Arabic": "أنا حسّاسة من المكسرات", + "Portuguese": "Eu sou alérgico a nozes", + "Bengali": "আমার বাদামে এলার্জি আছে", + "Russian": "У меня аллергия на орехи", + "Japanese": "種実類にアレルギーがあります", + "Punjabi": "ਮੈਨੂੰ ਨਟਸ ਤੋ ਏਲਰਜੀ ਹੈ", + "Javanese": "Aku alergi kacang", + "Korean": "나는 견과류에 알레르기가 있습니다", + "French": "Je suis allergique aux noix", + "German": "Ich bin allergisch gegen Nüsse" + }, + { + "English": "I have a headache", + "sceneType": "Healthy", + "Chinese (Simplified)": "我头痛", + "Spanish": "Me duele la cabeza", + "Hindi": "मेरे सिर में दर्द होता है", + "Arabic": "رأسي يؤلمني", + "Portuguese": "Minha cabeça dói", + "Bengali": "আমার মাথা ব্যাথা করছে", + "Russian": "Моя голова болит", + "Japanese": "頭が痛い", + "Punjabi": "ਮੇਰਾ ਸਿਰ ਦੁਖ ਰਿਹਾ ਹੈ", + "Javanese": "Sirahku lara", + "Korean": "내 머리 아파", + "French": "J'ai mal à la tête", + "German": "Mein Kopf tut weh" + }, + { + "English": "I need to rest", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要休息", + "Spanish": "necesito descansar", + "Hindi": "मुझे आराम करने की ज़रूरत है", + "Arabic": "أنا بحاجة إلى الراحة", + "Portuguese": "eu preciso descansar", + "Bengali": "আমার বিশ্রাম দরকার", + "Russian": "мне нужен отдых", + "Japanese": "私は休息する必要があります", + "Punjabi": "ਮੈਨੂੰ ਆਰਾਮ ਕਰਨ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku kudu ngaso", + "Korean": "난 휴식이 필요하다", + "French": "j'ai besoin de me reposer", + "German": "ich muss mich ausruhen" + }, + { + "English": "I have a fever", + "sceneType": "Healthy", + "Chinese (Simplified)": "我发烧了", + "Spanish": "Tengo fiebre", + "Hindi": "मुझे बुखार हे", + "Arabic": "لدى حمى", + "Portuguese": "Estou com febre", + "Bengali": "আমার জ্বর", + "Russian": "У меня жар", + "Japanese": "熱があります", + "Punjabi": "ਮੈਨੂੰ ਬੁਖਾਰ ਹੈ", + "Javanese": "Aku mriyang", + "Korean": "내가 열이", + "French": "J'ai de la fièvre", + "German": "Ich habe Fieber" + }, + { + "English": "I feel dizzy", + "sceneType": "Healthy", + "Chinese (Simplified)": "我觉得头晕", + "Spanish": "Me siento mareado", + "Hindi": "मुझे चक्कर आ रहा है", + "Arabic": "أشعر بالدوار", + "Portuguese": "Estou tonto", + "Bengali": "আমি হতবুদ্ধি মনে", + "Russian": "У меня кружится голова", + "Japanese": "眩暈がする", + "Punjabi": "ਮੈਨੂੰ ਚੱਕਰ ਆ ਰਿਹਾ ਹੈ", + "Javanese": "Aku krasa mumet", + "Korean": "어지러워", + "French": "Je me sens étourdi", + "German": "Mir ist schwindlig" + }, + { + "English": "I have a stomachache", + "sceneType": "Healthy", + "Chinese (Simplified)": "我胃痛", + "Spanish": "Tengo dolor de estómago", + "Hindi": "मेरे पेट में दर्द है", + "Arabic": "عندي ألم في المعدة", + "Portuguese": "Estou com dor de barriga", + "Bengali": "আমার এক্তা পাকস্থলী আছে", + "Russian": "У меня болит желудок", + "Japanese": "腹痛です", + "Punjabi": "ਮੈਨੂੰ ਪੇਟ ਦਰਦ ਹੈ", + "Javanese": "Aku lara weteng", + "Korean": "나는 복통이있다", + "French": "J'ai mal à l'estomac", + "German": "Ich habe Bauchschmerzen" + }, + { + "English": "I need a bandage", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要绷带", + "Spanish": "necesito un vendaje", + "Hindi": "मुझे एक पट्टी की जरूरत है", + "Arabic": "انا بحاجة الى ضمادة", + "Portuguese": "eu preciso de um curativo", + "Bengali": "আমার একটা ব্যান্ডেজ দরকার", + "Russian": "мне нужна повязка", + "Japanese": "包帯が必要です", + "Punjabi": "ਮੈਨੂੰ ਪੱਟੀ ਚਾਹੀਦੀ ਹੈ", + "Javanese": "aku butuh bandage", + "Korean": "붕대가 필요해", + "French": "j'ai besoin d'un pansement", + "German": "Ich brauche einen Verband" + }, + { + "English": "I feel better", + "sceneType": "Healthy", + "Chinese (Simplified)": "我感觉好些了", + "Spanish": "Me siento mejor", + "Hindi": "मैं बेहतर महसूस कर रहा हूँ", + "Arabic": "أشعر بتحسن", + "Portuguese": "eu me sinto melhor", + "Bengali": "আমি ভালো অনুভব করছি", + "Russian": "мне лучше", + "Japanese": "よくなった", + "Punjabi": "ਮੈਂ ਬਿਹਤਰ ਮਹਿਸੂਸ ਕਰਦਾ ਹਾਂ", + "Javanese": "aku rumangsa luwih apik", + "Korean": "한결 나아 졌어요", + "French": "je me sens mieux", + "German": "Ich fühle mich besser" + }, + { + "English": "I need a prescription", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要处方", + "Spanish": "necesito una receta", + "Hindi": "मुझे एक नुस्खे की जरूरत है", + "Arabic": "أحتاج إلى وصفة طبية", + "Portuguese": "Eu preciso de uma receita", + "Bengali": "আমার একটা প্রেসক্রিপশন দরকার", + "Russian": "мне нужен рецепт", + "Japanese": "処方箋が必要です", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਨੁਸਖ਼ੇ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku butuh resep", + "Korean": "처방전이 필요해요", + "French": "j'ai besoin d'une ordonnance", + "German": "Ich brauche ein Rezept" + }, + { + "English": "I have a cold", + "sceneType": "Healthy", + "Chinese (Simplified)": "我感冒了", + "Spanish": "Estoy enfermo", + "Hindi": "मैं बीमार हूं", + "Arabic": "أنا مريض", + "Portuguese": "estou doente", + "Bengali": "আমি অসুস্থ", + "Russian": "Я болею", + "Japanese": "私は病気です", + "Punjabi": "ਮੈਂ ਬੀਮਾਰ ਹਾਂ", + "Javanese": "aku lara", + "Korean": "나는 아프다", + "French": "je suis malade", + "German": "ich bin krank" + }, + { + "English": "I have a cough", + "sceneType": "Healthy", + "Chinese (Simplified)": "我咳嗽", + "Spanish": "Tengo tos", + "Hindi": "मुझे खाँसी है", + "Arabic": "لدي سعال", + "Portuguese": "Estou com tosse", + "Bengali": "আমি একটি কাশি আছে", + "Russian": "У меня кашель", + "Japanese": "咳が出ます", + "Punjabi": "ਮੈਨੂੰ ਖੰਘ ਹੈ", + "Javanese": "Aku watuk", + "Korean": "기침이 나요", + "French": "Je tousse", + "German": "Ich habe Husten" + }, + { + "English": "I need some rest", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要休息一下", + "Spanish": "necesito un descanso", + "Hindi": "मुझे एक ब्रेक की जरूरत है", + "Arabic": "أحتاج استراحة", + "Portuguese": "Eu preciso de um tempo", + "Bengali": "আমার একটা বিরতি দরকার", + "Russian": "мне нужен перерыв", + "Japanese": "一休みしたい", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਬ੍ਰੇਕ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku butuh istirahat", + "Korean": "나는 쉬는 시간이 필요합니다", + "French": "j'ai besoin d'une pause", + "German": "ich brauche eine Pause" + }, + { + "English": "I have an appointment with the doctor", + "sceneType": "Healthy", + "Chinese (Simplified)": "我有预约看医生", + "Spanish": "Tengo una cita médica", + "Hindi": "मेरा एक डॉक्टर से मिलने का समय निश्चित है", + "Arabic": "لدي موعد مع الطبيب", + "Portuguese": "Eu tenho uma consulta médica", + "Bengali": "আমার ডাক্তারের অ্যাপয়েন্টমেন্ট আছে", + "Russian": "у меня запись к врачу", + "Japanese": "医師の診察の予約があります", + "Punjabi": "ਮੇਰੇ ਕੋਲ ਡਾਕਟਰ ਦੀ ਮੁਲਾਕਾਤ ਹੈ", + "Javanese": "Aku duwe janjian karo dhokter", + "Korean": "의사 약속이 있어요", + "French": "j'ai rendez-vous chez le médecin", + "German": "Ich habe einen Termin beim Arzt" + }, + { + "English": "I feel weak", + "sceneType": "Healthy", + "Chinese (Simplified)": "我觉得虚弱", + "Spanish": "me siento debil", + "Hindi": "मुझे कमजोर लग रहा है", + "Arabic": "اشعر بالضعف", + "Portuguese": "Eu me sinto fraco", + "Bengali": "আমিদুর্বোল অনুভোব করছি", + "Russian": "я чувствую слабость", + "Japanese": "私は弱いと感じます", + "Punjabi": "ਮੈਂ ਕਮਜ਼ੋਰ ਮਹਿਸੂਸ ਕਰਦਾ ਹਾਂ", + "Javanese": "aku krasa lemes", + "Korean": "나 약한 것 같아", + "French": "je me sens faible", + "German": "ich fühle mich schwach" + }, + { + "English": "I have a sore throat", + "sceneType": "Healthy", + "Chinese (Simplified)": "我喉咙痛", + "Spanish": "tengo dolor de garganta", + "Hindi": "मैं गले में खराश है", + "Arabic": "لدي التهاب في الحلق", + "Portuguese": "eu tenho dor de garganta", + "Bengali": "আমার গলা ব্যাথা আছে", + "Russian": "у меня болит горло", + "Japanese": "のどが痛い", + "Punjabi": "ਮੇਰੇ ਗਲੇ ਵਿੱਚ ਦਰਦ ਹੈ", + "Javanese": "Aku lara tenggorokan", + "Korean": "나는 목이 아프다", + "French": "J'ai la gorge irritée", + "German": "Ich habe Halsschmerzen" + }, + { + "English": "I need some water", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要水", + "Spanish": "necesito agua", + "Hindi": "मुझे पानी की जरूरत है", + "Arabic": "أحتاج إلى الماء", + "Portuguese": "eu preciso de água", + "Bengali": "আমার পানি দরকার", + "Russian": "мне нужна вода", + "Japanese": "私は水を必要とします", + "Punjabi": "ਮੈਨੂੰ ਪਾਣੀ ਚਾਹੀਦਾ ਹੈ", + "Javanese": "aku butuh banyu", + "Korean": "물이 필요해", + "French": "J'ai besoin d'eau", + "German": "ich brauche Wasser" + }, + { + "English": "I have a runny nose", + "sceneType": "Healthy", + "Chinese (Simplified)": "我流鼻涕", + "Spanish": "Tengo la nariz que moquea", + "Hindi": "मेरी नाक बह रही है", + "Arabic": "أنفي يرشح", + "Portuguese": "Meu nariz está escorrendo", + "Bengali": "আমার নাক দিয়ে পানি পড়ছে", + "Russian": "У меня насморк", + "Japanese": "鼻水が出ます", + "Punjabi": "ਮੇਰਾ ਨੱਕ ਵੱਗ ਰਿਹਾ ਹੈ |", + "Javanese": "Aku duwe irung runny", + "Korean": "콧물이 흐르네요", + "French": "J'ai le nez qui coule", + "German": "Ich habe eine laufende Nase" + }, + { + "English": "I need to lie down", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要躺下", + "Spanish": "Necesito recostarme", + "Hindi": "मुझे लेटने की जरूरत है", + "Arabic": "انا بحاجة إلى الاستلقاء", + "Portuguese": "Preciso me deitar", + "Bengali": "আমাকে শুতে হবে", + "Russian": "мне нужно лечь", + "Japanese": "横になる必要があります", + "Punjabi": "ਮੈਨੂੰ ਲੇਟਣ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku kudu turu", + "Korean": "나 누워야 해", + "French": "J'ai besoin de m'allonger", + "German": "Ich muss mich hinlegen" + }, + { + "English": "I have a toothache", + "sceneType": "Healthy", + "Chinese (Simplified)": "我牙痛", + "Spanish": "Tengo dolor de muela", + "Hindi": "मेरे दांत में दर्द है", + "Arabic": "عندي ألم في الأسنان", + "Portuguese": "Estou com dor de dentes", + "Bengali": "আমার দাঁতে ব্যথা আছে", + "Russian": "У меня болит зуб", + "Japanese": "歯が痛いです", + "Punjabi": "ਮੇਰੇ ਦੰਦ ਵਿਚ ਪੀੜ ਹੈ", + "Javanese": "Aku lara untu", + "Korean": "치통이 있어요", + "French": "J'ai mal aux dents", + "German": "Ich habe Zahnschmerzen" + }, + { + "English": "I need to take my medicine", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要吃药", + "Spanish": "necesito tomar medicina", + "Hindi": "मुझे दवा लेनी है", + "Arabic": "أحتاج إلى تناول الدواء", + "Portuguese": "preciso tomar remédio", + "Bengali": "আমার ওষুধ খেতে হবে", + "Russian": "мне нужно принять лекарство", + "Japanese": "薬を飲まなければなりません", + "Punjabi": "ਮੈਨੂੰ ਦਵਾਈ ਲੈਣ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku kudu ngombe obat", + "Korean": "약을 먹어야 해요", + "French": "je dois prendre des médicaments", + "German": "Ich muss Medikamente nehmen" + }, + { + "English": "I feel nauseous", + "sceneType": "Healthy", + "Chinese (Simplified)": "我觉得恶心", + "Spanish": "me siento enferma", + "Hindi": "मैं बीमार महसूस कर रहा हूं", + "Arabic": "أشعر بالمرض", + "Portuguese": "Sinto-me doente", + "Bengali": "আমি অসুস্থবোধ করছি", + "Russian": "Меня тошнит", + "Japanese": "気分が悪いです", + "Javanese": "Aku krasa lara", + "Korean": "몸이 아프다", + "French": "Je me sens malade", + "German": "Mir ist schlecht" + }, + { + "English": "I need a doctor", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要医生", + "Spanish": "Necesito un médico", + "Hindi": "मुझे डॉक्टर की जरूरत है", + "Arabic": "انا بحاجة الى طبيب", + "Portuguese": "Eu preciso de um doutor", + "Bengali": "আমার একজন ডাক্তার প্রয়োজন", + "Russian": "мне нужен врач", + "Japanese": "私は医者を必要とする", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਡਾਕਟਰ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku butuh dokter", + "Korean": "의사가 필요 해요", + "French": "j'ai besoin d'un docteur", + "German": "Ich brauche einen Arzt" + }, + { + "English": "I have an allergy", + "sceneType": "Healthy", + "Chinese (Simplified)": "我有过敏反应", + "Spanish": "tengo una reacción alérgica", + "Hindi": "मुझे एलर्जिक प्रतिक्रिया है", + "Arabic": "لدي رد فعل تحسسي", + "Portuguese": "Eu tenho uma reação alérgica", + "Bengali": "আমার একটি এলার্জি প্রতিক্রিয়া আছে", + "Russian": "у меня аллергическая реакция", + "Japanese": "アレルギー反応があります", + "Punjabi": "ਮੈਨੂੰ ਐਲਰਜੀ ਵਾਲੀ ਪ੍ਰਤੀਕ੍ਰਿਆ ਹੈ", + "Javanese": "Aku duwe reaksi alergi", + "Korean": "알레르기 반응이 있어요", + "French": "J'ai une réaction allergique", + "German": "Ich habe eine allergische Reaktion" + }, + { + "English": "I need a tissue", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要纸巾", + "Spanish": "necesito pañuelos", + "Hindi": "मुझे ऊतकों की आवश्यकता है", + "Arabic": "انا بحاجة الى الأنسجة", + "Portuguese": "eu preciso de lenços", + "Bengali": "আমার টিস্যু দরকার", + "Russian": "мне нужны салфетки", + "Japanese": "ティッシュが必要です", + "Punjabi": "ਮੈਨੂੰ ਟਿਸ਼ੂਆਂ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku butuh tisu", + "Korean": "티슈가 필요해", + "French": "j'ai besoin de mouchoirs", + "German": "Ich brauche Taschentücher" + }, + { + "English": "I feel hot", + "sceneType": "Healthy", + "Chinese (Simplified)": "我觉得热", + "Spanish": "tengo calor", + "Hindi": "मुझे गर्मी महसूस हो रही है", + "Arabic": "أشعر بالحر", + "Portuguese": "Eu sinto calor", + "Bengali": "আমার গরম লাগছে", + "Russian": "мне жарко", + "Japanese": "暑く感じます", + "Punjabi": "ਮੈਨੂੰ ਗਰਮੀ ਮਹਿਸੂਸ ਹੁੰਦੀ ਹੈ", + "Javanese": "Aku krasa panas", + "Korean": "난 더워", + "French": "je me sens chaud", + "German": "mir ist heiß" + }, + { + "English": "I need to go to the hospital", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要去医院", + "Spanish": "necesito ir al hospital", + "Hindi": "मुझे अस्पताल जाना है", + "Arabic": "أحتاج للذهاب إلى المستشفى", + "Portuguese": "Eu preciso ir para o hospital", + "Bengali": "আমাকে হাসপাতালে যেতে হবে", + "Russian": "мне нужно в больницу", + "Japanese": "病院に行かなければなりません", + "Punjabi": "ਮੈਨੂੰ ਹਸਪਤਾਲ ਜਾਣ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku kudu menyang rumah sakit", + "Korean": "병원에 가야 해요", + "French": "je dois aller à l'hôpital", + "German": "Ich muss ins Krankenhaus" + }, + { + "English": "I have a rash", + "sceneType": "Healthy", + "Chinese (Simplified)": "我起疹子了", + "Spanish": "Tengo salpullido", + "Hindi": "मुझे रैश हो गया है", + "Arabic": "أنا أعاني من طفح جلدي", + "Portuguese": "Tenho uma coceira", + "Bengali": "আমার ফুসকুড়ি আছে", + "Russian": "У меня сыпь", + "Japanese": "吹き出物が出来ました", + "Javanese": "Aku duwe ruam", + "Korean": "발진이 생겼어요", + "French": "J'ai des rougeurs", + "German": "Ich habe einen Hautausschlag" + }, + { + "English": "I feel cold", + "sceneType": "Healthy", + "Chinese (Simplified)": "我觉得冷", + "Spanish": "Tengo frío", + "Hindi": "मुझे ठंड लग रही है", + "Arabic": "أنا بردان", + "Portuguese": "Estou com frio", + "Bengali": "আমি ঠান্ডা", + "Russian": "Мне холодно", + "Japanese": "寒いです", + "Punjabi": "ਮੈ ਠੰਡਾ ਹਾਂ", + "Javanese": "Aku kadhemen", + "Korean": "나는 추워요", + "French": "J'ai froid", + "German": "Mir ist kalt" + }, + { + "English": "I need some pain relief", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要止痛药", + "Spanish": "necesito analgésicos", + "Hindi": "मुझे दर्द निवारक दवा चाहिए", + "Arabic": "أحتاج إلى مسكنات الألم", + "Portuguese": "Eu preciso de analgésicos", + "Bengali": "আমার ব্যথানাশক দরকার", + "Russian": "мне нужны обезболивающие", + "Japanese": "鎮痛剤が必要です", + "Punjabi": "ਮੈਨੂੰ ਦਰਦ ਨਿਵਾਰਕ ਦਵਾਈਆਂ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku butuh obat penghilang rasa sakit", + "Korean": "진통제가 필요해요", + "French": "J'ai besoin d'analgésiques", + "German": "Ich brauche Schmerzmittel" + }, + { + "English": "I have a backache", + "sceneType": "Healthy", + "Chinese (Simplified)": "我背痛", + "Spanish": "Me duele la espalda", + "Portuguese": "Minhas costas doem", + "Bengali": "আমার পিঠ ব্যাথা করছে", + "Russian": "У меня болит спина", + "Japanese": "背中が痛いです", + "Punjabi": "ਮੇਰੀ ਕਮਰ ਦੇ ਪਿੱਛੇ ਦਰਦ ਹੈ", + "Javanese": "punggungku lara", + "Korean": "내 다시는 아파", + "French": "Mon dos me fait mal", + "German": "Mein Rücken tut weh" + }, + { + "English": "I feel short of breath", + "sceneType": "Healthy", + "Chinese (Simplified)": "我觉得喘不过气", + "Spanish": "me siento sin aliento", + "Hindi": "मुझे सांस फूलने लगती है", + "Arabic": "أشعر بضيق التنفس", + "Portuguese": "Eu me sinto sem fôlego", + "Bengali": "আমি শ্বাসকষ্ট অনুভব করি", + "Russian": "Я чувствую, что задыхаюсь", + "Japanese": "息が苦しくなる", + "Punjabi": "ਮੈਨੂੰ ਸਾਹ ਚੜ੍ਹਦਾ ਮਹਿਸੂਸ ਹੁੰਦਾ ਹੈ", + "Javanese": "Aku krasa sesak", + "Korean": "숨이 막힌다", + "French": "Je me sens essoufflé", + "German": "Ich fühle mich atemlos" + }, + { + "English": "I need a nurse", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要护士", + "Spanish": "necesito una enfermera", + "Hindi": "मुझे एक नर्स की जरूरत है", + "Arabic": "انا بحاجة الى ممرضة", + "Portuguese": "eu preciso de uma enfermeira", + "Bengali": "আমার একজন নার্স দরকার", + "Russian": "мне нужна медсестра", + "Japanese": "看護師が必要です", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਨਰਸ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku butuh perawat", + "Korean": "간호사가 필요해", + "French": "j'ai besoin d'une infirmière", + "German": "Ich brauche eine Krankenschwester" + }, + { + "English": "I have a fever", + "sceneType": "Healthy", + "Chinese (Simplified)": "我发烧了", + "Spanish": "Tengo fiebre", + "Hindi": "मुझे बुखार हे", + "Arabic": "لدى حمى", + "Portuguese": "Estou com febre", + "Bengali": "আমার জ্বর", + "Russian": "У меня жар", + "Japanese": "熱があります", + "Punjabi": "ਮੈਨੂੰ ਬੁਖਾਰ ਹੈ", + "Javanese": "Aku mriyang", + "Korean": "내가 열이", + "French": "J'ai de la fièvre", + "German": "Ich habe Fieber" + }, + { + "English": "I feel tired", + "sceneType": "Healthy", + "Chinese (Simplified)": "我觉得累", + "Spanish": "me siento cansado", + "Hindi": "मैं थकान महसूस कर रही हूँ", + "Arabic": "اشعر بالتعب", + "Portuguese": "Me sinto cansado", + "Bengali": "আমি ক্লান্ত", + "Russian": "я устал", + "Japanese": "私は疲れを感じる", + "Punjabi": "ਮੈਨੂੰ ਥਕਾਵਟ ਮਹਿਸੂਸ ਹੁੰਦੀ ਹੈ", + "Javanese": "Aku krasa kesel", + "Korean": "내가 피곤해", + "French": "je me sens fatigué", + "German": "ich bin müde" + }, + { + "English": "I need a doctor", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要医生", + "Spanish": "Necesito un médico", + "Hindi": "मुझे डॉक्टर की जरूरत है", + "Arabic": "انا بحاجة الى طبيب", + "Portuguese": "Eu preciso de um doutor", + "Bengali": "আমার একজন ডাক্তার প্রয়োজন", + "Russian": "мне нужен врач", + "Japanese": "私は医者を必要とする", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਡਾਕਟਰ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku butuh dokter", + "Korean": "의사가 필요 해요", + "French": "j'ai besoin d'un docteur", + "German": "Ich brauche einen Arzt" + }, + { + "English": "I have an earache", + "sceneType": "Healthy", + "Chinese (Simplified)": "我耳朵痛", + "Spanish": "mis oidos duelen", + "Hindi": "मेरे कानों में चोट लगी है", + "Arabic": "أذناي تؤلمانني", + "Portuguese": "Meus ouvidos doem", + "Bengali": "আমার কান ব্যাথা", + "Russian": "мои уши болят", + "Japanese": "耳が痛かった", + "Punjabi": "ਮੇਰੇ ਕੰਨ ਦੁਖਦੇ ਹਨ", + "Javanese": "kupingku lara", + "Korean": "귀가 아프다", + "French": "mes oreilles me font mal", + "German": "ich habe Ohrenschmerzen" + }, + { + "English": "I need a check-up", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要体检", + "Spanish": "necesito un examen fisico", + "Hindi": "मुझे शारीरिक परीक्षण की आवश्यकता है", + "Arabic": "أنا بحاجة إلى الفحص البدني", + "Portuguese": "Eu preciso de um exame físico", + "Bengali": "আমার শারীরিক পরীক্ষা দরকার", + "Russian": "мне нужен медицинский осмотр", + "Japanese": "身体検査が必要です", + "Punjabi": "ਮੈਨੂੰ ਸਰੀਰਕ ਜਾਂਚ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku butuh pemeriksaan fisik", + "Korean": "신체검사가 필요해요", + "French": "J'ai besoin d'un examen physique", + "German": "Ich brauche eine körperliche Untersuchung" + }, + { + "English": "I feel anxious", + "sceneType": "Healthy", + "Chinese (Simplified)": "我觉得焦虑", + "Spanish": "me siento ansioso", + "Hindi": "मुझे बेचैनी महसूस हो रही है", + "Arabic": "أشعر بالقلق", + "Portuguese": "Eu me sinto ansioso", + "Bengali": "আমি উদ্বিগ্ন বোধ করি", + "Russian": "Я чувствую тревогу", + "Japanese": "不安を感じます", + "Punjabi": "ਮੈਨੂੰ ਚਿੰਤਾ ਮਹਿਸੂਸ ਹੁੰਦੀ ਹੈ", + "Javanese": "Aku krasa kuwatir", + "Korean": "불안하다", + "French": "je me sens anxieux", + "German": "Ich bin besorgt" + }, + { + "English": "I have a bruise", + "sceneType": "Healthy", + "Chinese (Simplified)": "我有淤青", + "Spanish": "tengo moretones", + "Hindi": "मुझे चोट के निशान हैं", + "Arabic": "لدي كدمات", + "Portuguese": "Eu tenho hematomas", + "Bengali": "আমি ক্ষত আছে", + "Russian": "у меня синяки", + "Japanese": "あざがあります", + "Punjabi": "ਮੈਨੂੰ ਜ਼ਖਮ ਹਨ", + "Javanese": "Aku duwe bruises", + "Korean": "멍이 들었어", + "French": "j'ai des bleus", + "German": "Ich habe blaue Flecken" + }, + { + "English": "I need to take my medication", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要吃药", + "Spanish": "necesito tomar medicina", + "Hindi": "मुझे दवा लेनी है", + "Arabic": "أحتاج إلى تناول الدواء", + "Portuguese": "preciso tomar remédio", + "Bengali": "আমার ওষুধ খেতে হবে", + "Russian": "мне нужно принять лекарство", + "Japanese": "薬を飲まなければなりません", + "Punjabi": "ਮੈਨੂੰ ਦਵਾਈ ਲੈਣ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku kudu ngombe obat", + "Korean": "약을 먹어야 해요", + "French": "je dois prendre des médicaments", + "German": "Ich muss Medikamente nehmen" + }, + { + "English": "I feel sick to my stomach", + "sceneType": "Healthy", + "Chinese (Simplified)": "我胃里难受", + "Spanish": "Me siento mal del estómago", + "Hindi": "मेरे पेट में दर्द हो रहा है", + "Arabic": "أشعر بالغثيان في معدتي", + "Portuguese": "Sinto-me mal do estômago", + "Bengali": "আমি আমার পেট থেকে অসুস্থ বোধ", + "Russian": "меня тошнит от живота", + "Japanese": "お腹が痛くなる", + "Punjabi": "ਮੈਂ ਆਪਣੇ ਪੇਟ ਨੂੰ ਬਿਮਾਰ ਮਹਿਸੂਸ ਕਰਦਾ ਹਾਂ", + "Javanese": "Aku krasa lara weteng", + "Korean": "배가 아프다", + "French": "J'ai mal au ventre", + "German": "Mir ist schlecht im Magen" + }, + { + "English": "I have a cut", + "sceneType": "Healthy", + "Chinese (Simplified)": "我有一个伤口", + "Spanish": "Tengo una herida", + "Hindi": "मुझे एक घाव हुआ है", + "Arabic": "أنا أعاني من جرح", + "Portuguese": "Tenho um machucado", + "Bengali": "আমার একটি ক্ষত আছে", + "Russian": "У меня рана", + "Japanese": "怪我をしました", + "Punjabi": "ਮੈਨੂੰ ਜਖਮ ਹੋ ਗਿਆ ਹੈ", + "Javanese": "aku duwe tatu", + "Korean": "나한테 상처가 있어", + "French": "J'ai une plaie", + "German": "Ich habe eine Wunde" + }, + { + "English": "I need some vitamins", + "sceneType": "Healthy", + "Chinese (Simplified)": "我需要一些维生素", + "Spanish": "necesito algunas vitaminas", + "Hindi": "मुझे कुछ विटामिन चाहिए", + "Arabic": "انا بحاجة الى بعض الفيتامينات", + "Portuguese": "eu preciso de algumas vitaminas", + "Bengali": "আমার কিছু ভিটামিন দরকার", + "Russian": "мне нужны витамины", + "Japanese": "ビタミンが必要です", + "Punjabi": "ਮੈਨੂੰ ਕੁਝ ਵਿਟਾਮਿਨਾਂ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku butuh sawetara vitamin", + "Korean": "비타민이 좀 필요해", + "French": "j'ai besoin de vitamines", + "German": "Ich brauche ein paar Vitamine" + }, + { + "English": "I feel better after resting", + "sceneType": "Healthy", + "Chinese (Simplified)": "休息后我感觉好多了", + "Spanish": "Me siento mejor después de descansar", + "Hindi": "आराम करने के बाद मैं बेहतर महसूस कर रहा हूं", + "Arabic": "أشعر بتحسن بعد الراحة", + "Portuguese": "Me sinto melhor depois de descansar", + "Bengali": "আমি বিশ্রামের পরে ভাল অনুভব করি", + "Russian": "Я чувствую себя лучше после отдыха", + "Japanese": "休んだ後は気分が良くなります", + "Punjabi": "ਮੈਂ ਆਰਾਮ ਕਰਨ ਤੋਂ ਬਾਅਦ ਬਿਹਤਰ ਮਹਿਸੂਸ ਕਰਦਾ ਹਾਂ", + "Javanese": "Aku krasa luwih apik sawise ngaso", + "Korean": "쉬고 나면 기분이 좋아진다", + "French": "Je me sens mieux après m'être reposé", + "German": "Nach dem Ausruhen geht es mir besser" + }, + { + "English": "I have a medical emergency", + "sceneType": "Healthy", + "Chinese (Simplified)": "我有紧急医疗情况", + "Spanish": "tengo una emergencia medica", + "Hindi": "मेरे पास एक मेडिकल इमरजेंसी है", + "Arabic": "لدي حالة طبية طارئة", + "Portuguese": "Eu tenho uma emergência médica", + "Bengali": "আমার একটি মেডিকেল ইমার্জেন্সি আছে", + "Russian": "У меня неотложная медицинская помощь", + "Japanese": "緊急事態が発生しました", + "Punjabi": "ਮੇਰੇ ਕੋਲ ਮੈਡੀਕਲ ਐਮਰਜੈਂਸੀ ਹੈ", + "Javanese": "Aku duwe darurat medis", + "Korean": "의료적 응급상황이 발생했습니다.", + "French": "J'ai une urgence médicale", + "German": "Ich habe einen medizinischen Notfall" + } + ] + }, + { + "sceneSource": "Daily greetings", + "sceneType": "Daily greetings", + "sceneList": [ + { + "English": "Hello", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "你好", + "Spanish": "Hola", + "Hindi": "नमस्ते", + "Arabic": "مرحبًا", + "Portuguese": "Olá", + "Bengali": "হ্যালো", + "Russian": "Привет", + "Japanese": "こんにちは", + "Punjabi": "ਸਤ ਸ੍ਰੀ ਅਕਾਲ", + "Javanese": "Halo", + "Korean": "안녕하세요", + "French": "Bonjour", + "German": "Hallo" + }, + { + "English": "Good morning", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "早上好", + "Spanish": "Buen día", + "Hindi": "शुभ प्रभात", + "Arabic": "صباح الخير", + "Portuguese": "Bom dia", + "Bengali": "সুপ্রভাত", + "Russian": "Доброе утро", + "Japanese": "おはよう", + "Punjabi": "ਸ਼ੁਭ ਸਵੇਰ", + "Javanese": "sugeng enjang", + "Korean": "좋은 아침이에요", + "French": "Bonjour", + "German": "Guten Morgen" + }, + { + "English": "Good night", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "晚安", + "Spanish": "Buenas noches", + "Hindi": "शुभ रात्रि", + "Arabic": "طاب مساؤك", + "Portuguese": "Boa noite", + "Bengali": "শুভ রাত্রি", + "Russian": "Спокойной ночи", + "Japanese": "おやすみ", + "Punjabi": "ਸ਼ੁਭ ਰਾਤ", + "Javanese": "sugeng dalu", + "Korean": "안녕히 주무세요", + "French": "Bonne nuit", + "German": "Gute Nacht" + }, + { + "English": "How are you?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "你好吗?", + "Spanish": "¿Estás bien?", + "Hindi": "क्या आप ठीक हैं?", + "Arabic": "هل أنت بخير؟", + "Portuguese": "Você está bem?", + "Bengali": "তুমি ঠিক আছ?", + "Russian": "Ты в порядке?", + "Japanese": "大丈夫ですか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਠੀਕ ਹੋ?", + "Javanese": "Apa sampeyan ora apa-apa?", + "Korean": "괜찮으세요?", + "French": "Êtes-vous ok?", + "German": "Geht es dir gut?" + }, + { + "English": "Nice to meet you", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "很高兴见到你", + "Spanish": "Encantado de conocerlo", + "Hindi": "आपसे मिलकर अच्छा लगा", + "Arabic": "سعيد بلقائك", + "Portuguese": "Prazer em conhecê-lo", + "Bengali": "তোমার সাথে দেখা করে ভালো লাগলো", + "Russian": "Рад встрече", + "Japanese": "はじめまして", + "Punjabi": "ਤੁਹਾਨੂੰ ਮਿਲਕੇ ਅੱਛਾ ਲਗਿਆ", + "Javanese": "Seneng ketemu kowe", + "Korean": "만나서 반가워요", + "French": "Ravi de vous rencontrer", + "German": "Freut mich, Sie kennenzulernen" + }, + { + "English": "Goodbye", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "再见", + "Spanish": "adiós", + "Hindi": "अलविदा", + "Arabic": "مع السلامة", + "Portuguese": "adeus", + "Bengali": "বিদায়", + "Russian": "до свидания", + "Japanese": "さようなら", + "Punjabi": "ਅਲਵਿਦਾ", + "Javanese": "pamit", + "Korean": "안녕히 가세요", + "French": "au revoir", + "German": "Verabschiedung" + }, + { + "English": "See you later", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "待会见", + "Spanish": "hasta luego", + "Hindi": "बाद में मिलते हैं", + "Arabic": "أراك لاحقًا", + "Portuguese": "até mais", + "Bengali": "পরে দেখা হবে", + "Russian": "увидимся позже", + "Japanese": "また後で", + "Punjabi": "ਫਿਰ ਮਿਲਦੇ ਹਾਂ", + "Javanese": "ketemu mengko", + "Korean": "나중에 봐요", + "French": "à plus tard", + "German": "bis später" + }, + { + "English": "Have a nice day", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "祝你有美好的一天", + "Spanish": "Que tenga un lindo día", + "Hindi": "आपका दिन शुभ हो", + "Arabic": "طاب يومك", + "Portuguese": "Tenha um bom dia", + "Bengali": "আপনার দিনটি শুভ হোক", + "Russian": "Хорошего дня", + "Japanese": "良い1日を", + "Punjabi": "ਤੁਹਾਡਾ ਦਿਨ ਅੱਛਾ ਹੋ", + "Javanese": "Sugeng dina", + "Korean": "좋은 하루 되세요", + "French": "Passe une bonne journée", + "German": "Einen schönen Tag noch" + }, + { + "English": "Take care", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "保重", + "Spanish": "Cuídate", + "Hindi": "अपना ख्याल रखें", + "Arabic": "اعتنِ بنفسك", + "Portuguese": "Cuide-se", + "Bengali": "তোমার যত্ন নিও", + "Russian": "Береги себя", + "Japanese": "自分を大事にして下さい", + "Punjabi": "ਆਪਣਾ ਖਿਆਲ ਰੱਖਣਾ", + "Javanese": "Jogo awakmu", + "Korean": "몸 조심하세요", + "French": "Prends soin de toi", + "German": "Pass auf dich auf" + }, + { + "English": "Good evening", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "晚上好", + "Spanish": "Buenas noches", + "Hindi": "शुभ संध्या", + "Arabic": "مساء الخير", + "Portuguese": "Boa noite", + "Bengali": "শুভ সন্ধ্যা", + "Russian": "Добрый вечер", + "Japanese": "こんばんは", + "Punjabi": "ਸਤ ਸ੍ਰੀ ਅਕਾਲ", + "Javanese": "sugeng sonten", + "Korean": "좋은 저녁이에요", + "French": "Bonne soirée", + "German": "Guten Abend" + }, + { + "English": "What's up?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "最近怎么样?", + "Spanish": "¿cómo son las cosas?", + "Hindi": "कैसा चल रहा है?", + "Arabic": "كيف هي الأمور؟", + "Portuguese": "como estão as coisas?", + "Bengali": "সবকিছু কেমন চলছে?", + "Russian": "как дела?", + "Japanese": "調子はどう?", + "Punjabi": "ਸਭ ਕੁਝ ਕਿਦਾਂ ਹੈ?", + "Javanese": "piye kabare?", + "Korean": "상황은 어때?", + "French": "comment ça va?", + "German": "wie geht's?" + }, + { + "English": "How's it going?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "进展如何?", + "Spanish": "¿Como está el progreso?", + "Hindi": "प्रगति कैसी है?", + "Arabic": "كيف هي التقدم؟", + "Portuguese": "como está o progresso?", + "Bengali": "অগ্রগতি কেমন?", + "Russian": "как прогресс?", + "Japanese": "進捗状況はどうですか?", + "Punjabi": "ਤਰੱਕੀ ਕਿਵੇਂ ਹੈ?", + "Javanese": "piye kemajuane?", + "Korean": "진행 상황은 어떻습니까?", + "French": "comment est le progrès?", + "German": "wie geht es voran?" + }, + { + "English": "Long time no see", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "好久不见", + "Spanish": "hace mucho que no te veo", + "Hindi": "बहुत दिनों से तुम्हें देखा नहीं", + "Arabic": "لم أراك منذ فترة طويلة", + "Portuguese": "não te vejo há muito tempo", + "Bengali": "তোমাকে অনেকদিন দেখিনি", + "Russian": "давно тебя не видел", + "Japanese": "長い間会っていません", + "Punjabi": "ਤੁਹਾਨੂੰ ਲੰਬੇ ਸਮੇਂ ਤੋਂ ਨਹੀਂ ਦੇਖਿਆ ਹੈ", + "Javanese": "wis suwe ora ketemu", + "Korean": "오랫동안 당신을 보지 못했어요", + "French": "je ne t'ai pas vu depuis longtemps", + "German": "Ich habe dich schon lange nicht gesehen" + }, + { + "English": "It's been a while", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "有段时间没见了", + "Spanish": "No te he visto por un tiempo", + "Hindi": "काफी समय से तुम्हें देखा नहीं", + "Arabic": "لم أراك منذ فترة", + "Portuguese": "Faz um tempo que não te vejo", + "Bengali": "তোমাকে অনেকদিন দেখিনি", + "Russian": "Давно тебя не видел", + "Japanese": "しばらく会っていません", + "Punjabi": "ਤੁਹਾਨੂੰ ਕੁਝ ਸਮੇਂ ਤੋਂ ਨਹੀਂ ਦੇਖਿਆ ਹੈ", + "Javanese": "Wis suwe ora ketemu", + "Korean": "한동안 당신을 보지 못했어요", + "French": "Je ne t'ai pas vu depuis un moment", + "German": "Ich habe dich eine Weile nicht gesehen" + }, + { + "English": "How have you been?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "你过得怎么样?", + "Spanish": "¿Cómo estás?", + "Hindi": "आप कैसे हैं?", + "Arabic": "كيف حالك؟", + "Portuguese": "Como vai?", + "Bengali": "তুমি কেমন আছ?", + "Russian": "Как дела?", + "Japanese": "お元気ですか?", + "Punjabi": "ਤੁਸੀਂ ਕਿਵੇਂ ਹੋ?", + "Javanese": "Piye kabarmu?", + "Korean": "어떻게 지내세요?", + "French": "Comment allez-vous?", + "German": "Wie geht es dir?" + }, + { + "English": "Pleased to meet you", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "很高兴见到你", + "Spanish": "Encantado de conocerlo", + "Hindi": "आपसे मिलकर अच्छा लगा", + "Arabic": "سعيد بلقائك", + "Portuguese": "Prazer em conhecê-lo", + "Bengali": "তোমার সাথে দেখা করে ভালো লাগলো", + "Russian": "Рад встрече", + "Japanese": "はじめまして", + "Punjabi": "ਤੁਹਾਨੂੰ ਮਿਲਕੇ ਅੱਛਾ ਲਗਿਆ", + "Javanese": "Seneng ketemu kowe", + "Korean": "만나서 반가워요", + "French": "Ravi de vous rencontrer", + "German": "Freut mich, Sie kennenzulernen" + }, + { + "English": "How do you do?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "你好", + "Spanish": "Hola", + "Hindi": "नमस्ते", + "Arabic": "مرحبًا", + "Portuguese": "Olá", + "Bengali": "হ্যালো", + "Russian": "Привет", + "Japanese": "こんにちは", + "Punjabi": "ਸਤ ਸ੍ਰੀ ਅਕਾਲ", + "Javanese": "Halo", + "Korean": "안녕하세요", + "French": "Bonjour", + "German": "Hallo" + }, + { + "English": "What's new?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "有什么新鲜事吗?", + "Spanish": "¿Qué hay de nuevo?", + "Hindi": "नया क्या है?", + "Arabic": "ما هو الجديد؟", + "Portuguese": "O que há de novo?", + "Bengali": "নতুন কি?", + "Russian": "Что нового?", + "Japanese": "新着情報?", + "Punjabi": "ਨਵਾਂ ਕੀ ਹੈ?", + "Javanese": "Apa sing anyar?", + "Korean": "새로운 소식은 무엇인가요?", + "French": "Quoi de neuf?", + "German": "Was ist neu?" + }, + { + "English": "Glad to see you", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "很高兴见到你", + "Spanish": "Encantado de conocerlo", + "Hindi": "आपसे मिलकर अच्छा लगा", + "Arabic": "سعيد بلقائك", + "Portuguese": "Prazer em conhecê-lo", + "Bengali": "তোমার সাথে দেখা করে ভালো লাগলো", + "Russian": "Рад встрече", + "Japanese": "はじめまして", + "Punjabi": "ਤੁਹਾਨੂੰ ਮਿਲਕੇ ਅੱਛਾ ਲਗਿਆ", + "Javanese": "Seneng ketemu kowe", + "Korean": "만나서 반가워요", + "French": "Ravi de vous rencontrer", + "German": "Freut mich, Sie kennenzulernen" + }, + { + "English": "It's nice to see you again", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "很高兴再次见到你", + "Spanish": "Realmente feliz de verte de nuevo.", + "Hindi": "तुम्हें दोबारा देखकर सचमुच बहुत खुशी हुई", + "Arabic": "سعيد حقا لرؤيتك مرة أخرى", + "Portuguese": "Muito feliz em ver você novamente", + "Bengali": "আপনাকে আবার দেখে সত্যিই খুশি", + "Russian": "Очень рад видеть вас снова", + "Japanese": "またお会いできて本当に嬉しいです", + "Punjabi": "ਤੁਹਾਨੂੰ ਦੁਬਾਰਾ ਦੇਖ ਕੇ ਸੱਚਮੁੱਚ ਬਹੁਤ ਖੁਸ਼ੀ ਹੋਈ", + "Javanese": "Seneng tenan bisa ketemu maneh", + "Korean": "다시 만나서 정말 기뻐요", + "French": "Vraiment heureux de te revoir", + "German": "Ich freue mich wirklich, Sie wiederzusehen" + }, + { + "English": "How's everything?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "一切都好吗?", + "Spanish": "todo bien?", + "Hindi": "सब कुछ ठीक है?", + "Arabic": "كل شيئ بخير؟", + "Portuguese": "tudo bem?", + "Bengali": "সবকিছু ভাল?", + "Russian": "все в порядке?", + "Japanese": "大丈夫ですか?", + "Punjabi": "ਸਭ ਕੁਝ ਠੀਕ ਹੈ?", + "Javanese": "kabeh apik?", + "Korean": "다 괜찮아?", + "French": "tout va bien?", + "German": "alles ist gut?" + }, + { + "English": "How's your day?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "你今天过得怎么样?", + "Spanish": "¿Como estuvo hoy tu día?", + "Hindi": "आज आपका दिन कैसा था?", + "Arabic": "كيف كان يومك؟", + "Portuguese": "Como foi seu dia hoje?", + "Bengali": "আজ কেমন কাটল তোমার?", + "Russian": "Как ваш день сегодня?", + "Japanese": "今日はどうだった?", + "Punjabi": "ਅੱਜ ਤੁਹਾਡਾ ਦਿਨ ਕਿਹੋ ਜਿਹਾ ਰਿਹਾ?", + "Javanese": "Piye kabarmu dina iki?", + "Korean": "오늘은 어땠 니?", + "French": "Comment s'est passée ta journée?", + "German": "Wie war dein Tag heute?" + }, + { + "English": "How's your morning?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "你早上过得怎么样?", + "Spanish": "¿Como estuvo tu mañana?", + "Hindi": "आपकी सुबह कैसी थी?", + "Arabic": "كيف كان صباحك؟", + "Portuguese": "como foi sua manhã?", + "Bengali": "তোমার সকাল কেমন ছিল?", + "Russian": "Как прошло утро?", + "Japanese": "朝はどうでしたか?", + "Punjabi": "ਤੁਹਾਡੀ ਸਵੇਰ ਕਿਵੇਂ ਰਹੀ?", + "Javanese": "Kepiye esukmu?", + "Korean": "아침은 어땠나요?", + "French": "Comment était ta matinée?", + "German": "Wie war dein Morgen?" + }, + { + "English": "How's your evening?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "你晚上过得怎么样?", + "Spanish": "¿Cómo estuvo tu velada?", + "Hindi": "तुम्हारी शाम कैसी थी?", + "Arabic": "كيف كان مساؤك؟", + "Portuguese": "Como foi sua noite?", + "Bengali": "কিভাবে আপনার সন্ধ্যায় ছিল?", + "Russian": "Как прошел твой вечер?", + "Japanese": "夜はどうでしたか?", + "Punjabi": "ਤੁਹਾਡੀ ਸ਼ਾਮ ਕਿਵੇਂ ਰਹੀ?", + "Javanese": "Piye soremu?", + "Korean": "너의 저녁은 어땠 니?", + "French": "Comment s'est passée ta soirée?", + "German": "Wie war dein Abend?" + }, + { + "English": "Have you been busy?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "你最近忙吗?", + "Spanish": "¿Estás ocupado últimamente?", + "Hindi": "क्या आप हाल ही में व्यस्त हैं?", + "Arabic": "هل أنت مشغول في الآونة الأخيرة؟", + "Portuguese": "Você está ocupado ultimamente?", + "Bengali": "আপনি কি ইদানীং ব্যস্ত?", + "Russian": "Вы заняты в последнее время?", + "Japanese": "最近忙しいですか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਹਾਲ ਹੀ ਵਿੱਚ ਰੁੱਝੇ ਹੋ?", + "Javanese": "Apa sampeyan sibuk akhir-akhir iki?", + "Korean": "요즘 바빠요?", + "French": "Êtes-vous occupé ces derniers temps ?", + "German": "Bist du in letzter Zeit beschäftigt?" + }, + { + "English": "How's your family?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "你家人怎么样?", + "Spanish": "¿Cómo está tu familia?", + "Hindi": "आपका परिवार कैसा है?", + "Arabic": "كيف حال اسرتك؟", + "Portuguese": "Como é a sua família?", + "Bengali": "তোমার বাসার সবাই কেমন আছে?", + "Russian": "Как ваша семья?", + "Japanese": "あなたの家族は元気ですか?", + "Punjabi": "ਤੁਹਾਡਾ ਪਰਵਾਰ ਕਿਵੇਂ ਹੈ?", + "Javanese": "Piye keluargamu?", + "Korean": "당신의 가족은 안녕하십니까?", + "French": "Comment va ta famille?", + "German": "Wie geht's deiner Familie?" + }, + { + "English": "It's nice to see you", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "很高兴见到你", + "Spanish": "Encantado de conocerlo", + "Hindi": "आपसे मिलकर अच्छा लगा", + "Arabic": "سعيد بلقائك", + "Portuguese": "Prazer em conhecê-lo", + "Bengali": "তোমার সাথে দেখা করে ভালো লাগলো", + "Russian": "Рад встрече", + "Japanese": "はじめまして", + "Punjabi": "ਤੁਹਾਨੂੰ ਮਿਲਕੇ ਅੱਛਾ ਲਗਿਆ", + "Javanese": "Seneng ketemu kowe", + "Korean": "만나서 반가워요", + "French": "Ravi de vous rencontrer", + "German": "Freut mich, Sie kennenzulernen" + }, + { + "English": "How's life?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "生活怎么样?", + "Spanish": "¿Como es la vida?", + "Hindi": "जिंदगी कैसी चल रही है?", + "Arabic": "كيف هي الحياة؟", + "Portuguese": "Como é a vida?", + "Bengali": "জীবনটা কেমন?", + "Russian": "Как жизнь?", + "Japanese": "人生はどうですか?", + "Punjabi": "ਜਿੰਦਗੀ ਕਿਵੇਂ ਹੈ?", + "Javanese": "Carane urip?", + "Korean": "인생은 어때요?", + "French": "Comment est la vie?", + "German": "Wie ist das Leben?" + }, + { + "English": "What's going on?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "发生什么事了?", + "Spanish": "¿Qué pasó?", + "Hindi": "क्या हुआ?", + "Arabic": "ماذا حدث؟", + "Portuguese": "O que aconteceu?", + "Bengali": "কি হলো?", + "Russian": "Что случилось?", + "Japanese": "どうしたの?", + "Punjabi": "ਕੀ ਹੋਇਆ?", + "Javanese": "Ana apa?", + "Korean": "무슨 일이에요?", + "French": "Ce qui s'est passé?", + "German": "Was ist passiert?" + }, + { + "English": "What's happening?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "发生什么事了?", + "Spanish": "¿Qué pasó?", + "Hindi": "क्या हुआ?", + "Arabic": "ماذا حدث؟", + "Portuguese": "O que aconteceu?", + "Bengali": "কি হলো?", + "Russian": "Что случилось?", + "Japanese": "どうしたの?", + "Punjabi": "ਕੀ ਹੋਇਆ?", + "Javanese": "Ana apa?", + "Korean": "무슨 일이에요?", + "French": "Ce qui s'est passé?", + "German": "Was ist passiert?" + }, + { + "English": "It's a pleasure to meet you", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "很高兴见到你", + "Spanish": "Encantado de conocerlo", + "Hindi": "आपसे मिलकर अच्छा लगा", + "Arabic": "سعيد بلقائك", + "Portuguese": "Prazer em conhecê-lo", + "Bengali": "তোমার সাথে দেখা করে ভালো লাগলো", + "Russian": "Рад встрече", + "Japanese": "はじめまして", + "Punjabi": "ਤੁਹਾਨੂੰ ਮਿਲਕੇ ਅੱਛਾ ਲਗਿਆ", + "Javanese": "Seneng ketemu kowe", + "Korean": "만나서 반가워요", + "French": "Ravi de vous rencontrer", + "German": "Freut mich, Sie kennenzulernen" + }, + { + "English": "I'm glad to see you", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "很高兴见到你", + "Spanish": "Encantado de conocerlo", + "Hindi": "आपसे मिलकर अच्छा लगा", + "Arabic": "سعيد بلقائك", + "Portuguese": "Prazer em conhecê-lo", + "Bengali": "তোমার সাথে দেখা করে ভালো লাগলো", + "Russian": "Рад встрече", + "Japanese": "はじめまして", + "Punjabi": "ਤੁਹਾਨੂੰ ਮਿਲਕੇ ਅੱਛਾ ਲਗਿਆ", + "Javanese": "Seneng ketemu kowe", + "Korean": "만나서 반가워요", + "French": "Ravi de vous rencontrer", + "German": "Freut mich, Sie kennenzulernen" + }, + { + "English": "How are things?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "情况怎么样?", + "Spanish": "¿Cómo está yendo?", + "Hindi": "कैसा चल रहा है?", + "Arabic": "كيف الحال أو كيف تسير الأمور؟", + "Portuguese": "Como vão as coisas?", + "Bengali": "কেমন চলছে?", + "Russian": "Как дела?", + "Japanese": "調子はどうだい?", + "Punjabi": "ਕਿਵੇਂ ਚੱਲ ਰਿਹਾ ਹੈ?", + "Javanese": "Piye kabare?", + "Korean": "어떻게 지내요?", + "French": "Comment ça se passe?", + "German": "Wie geht es Ihnen?" + }, + { + "English": "How's your week going?", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "你这一周过得怎么样?", + "Spanish": "¿Cómo estuvo tu semana?", + "Hindi": "तुम्हारा सप्ताह कैसा था?", + "Arabic": "كيف كان أسبوعك؟", + "Portuguese": "Como foi sua semana?", + "Bengali": "আপনার সপ্তাহ কেমন কাটলো?", + "Russian": "Как прошла твоя неделя?", + "Japanese": "一週間はどうでしたか?", + "Punjabi": "ਤੁਹਾਡਾ ਹਫ਼ਤਾ ਕਿਵੇਂ ਰਿਹਾ?", + "Javanese": "Piye minggumu?", + "Korean": "이번주 어땠어요?", + "French": "Comment s'est passée ta semaine?", + "German": "Wie war Ihre Woche?" + }, + { + "English": "Nice to see you", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "很高兴见到你", + "Spanish": "Encantado de conocerlo", + "Hindi": "आपसे मिलकर अच्छा लगा", + "Arabic": "سعيد بلقائك", + "Portuguese": "Prazer em conhecê-lo", + "Bengali": "তোমার সাথে দেখা করে ভালো লাগলো", + "Russian": "Рад встрече", + "Japanese": "はじめまして", + "Punjabi": "ਤੁਹਾਨੂੰ ਮਿਲਕੇ ਅੱਛਾ ਲਗਿਆ", + "Javanese": "Seneng ketemu kowe", + "Korean": "만나서 반가워요", + "French": "Ravi de vous rencontrer", + "German": "Freut mich, Sie kennenzulernen" + }, + { + "English": "Have a great day", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "祝你有美好的一天", + "Spanish": "Que tenga un lindo día", + "Hindi": "आपका दिन शुभ हो", + "Arabic": "طاب يومك", + "Portuguese": "Tenha um bom dia", + "Bengali": "আপনার দিনটি শুভ হোক", + "Russian": "Хорошего дня", + "Japanese": "良い1日を", + "Punjabi": "ਤੁਹਾਡਾ ਦਿਨ ਅੱਛਾ ਹੋ", + "Javanese": "Sugeng dina", + "Korean": "좋은 하루 되세요", + "French": "Passe une bonne journée", + "German": "Einen schönen Tag noch" + }, + { + "English": "Good to see you", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "很高兴见到你", + "Spanish": "Encantado de conocerlo", + "Hindi": "आपसे मिलकर अच्छा लगा", + "Arabic": "سعيد بلقائك", + "Portuguese": "Prazer em conhecê-lo", + "Bengali": "তোমার সাথে দেখা করে ভালো লাগলো", + "Russian": "Рад встрече", + "Japanese": "はじめまして", + "Punjabi": "ਤੁਹਾਨੂੰ ਮਿਲਕੇ ਅੱਛਾ ਲਗਿਆ", + "Javanese": "Seneng ketemu kowe", + "Korean": "만나서 반가워요", + "French": "Ravi de vous rencontrer", + "German": "Freut mich, Sie kennenzulernen" + }, + { + "English": "Take it easy", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "放轻松", + "Spanish": "tómalo con calma", + "Hindi": "आराम से लो", + "Arabic": "خذها ببساطة", + "Portuguese": "vá com calma", + "Bengali": "এটা হাল্কা ভাবে নিন", + "Russian": "не принимайте близко к сердцу", + "Japanese": "落ち着いて", + "Punjabi": "ਆਰਾਮ ਨਾਲ ਕਰੋ", + "Javanese": "santai wae", + "Korean": "진정해", + "French": "Allez-y doucement", + "German": "nehmen Sie es einfach" + }, + { + "English": "Stay safe", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "注意安全", + "Spanish": "estar a salvo", + "Hindi": "सुरक्षित हों", + "Arabic": "كن آمنا", + "Portuguese": "esteja a salvo", + "Bengali": "সাবধান থাকা", + "Russian": "быть безопасным", + "Japanese": "注意安全", + "Punjabi": "ਮਹਿਫ਼ੂਜ਼ ਰਹੋ", + "Javanese": "dadi aman", + "Korean": "안전한", + "French": "fais attention", + "German": "sicher sein" + }, + { + "English": "See you soon", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "很快见", + "Spanish": "nos vemos pronto", + "Hindi": "जल्द ही फिर मिलेंगे", + "Arabic": "اراك قريبا", + "Portuguese": "vejo você em breve", + "Bengali": "শীঘ্রই আবার দেখা হবে", + "Russian": "до скорой встречи", + "Japanese": "また近いうちにお会いしましょう", + "Punjabi": "ਜਲਦੀ ਮਿਲਦੇ ਹਾਂ", + "Javanese": "ketemu enggal", + "Korean": "곧 봐요", + "French": "à bientôt", + "German": "bis bald" + }, + { + "English": "Talk to you later", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "待会聊", + "Spanish": "Charlar después", + "Hindi": "बाद में बात करें", + "Arabic": "نتحدث لاحقا", + "Portuguese": "Conversar mais tarde", + "Bengali": "পরে কথা হবে", + "Russian": "Спишемся позже", + "Japanese": "後でチャットする", + "Punjabi": "ਬਾਅਦ ਵਿੱਚ ਗੱਲਬਾਤ ਕਰੋ", + "Javanese": "Ngobrol mengko", + "Korean": "나중에 얘기 해요", + "French": "Discuter plus tard", + "German": "Chatten Sie später" + }, + { + "English": "Have a good one", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "祝你好运", + "Spanish": "Buena suerte", + "Hindi": "आपको कामयाबी मिले", + "Arabic": "حظ سعيد", + "Portuguese": "Boa sorte", + "Bengali": "শুভকামনা", + "Russian": "Удачи", + "Japanese": "幸運を", + "Punjabi": "ਖੁਸ਼ਕਿਸਮਤੀ", + "Javanese": "Sugeng dalu", + "Korean": "행운을 빌어요", + "French": "Bonne chance", + "German": "Viel Glück" + }, + { + "English": "Catch you later", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "待会见", + "Spanish": "hasta luego", + "Hindi": "बाद में मिलते हैं", + "Arabic": "أراك لاحقًا", + "Portuguese": "até mais", + "Bengali": "পরে দেখা হবে", + "Russian": "увидимся позже", + "Japanese": "また後で", + "Punjabi": "ਫਿਰ ਮਿਲਦੇ ਹਾਂ", + "Javanese": "ketemu mengko", + "Korean": "나중에 봐요", + "French": "à plus tard", + "German": "bis später" + }, + { + "English": "All the best", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "祝一切顺利", + "Spanish": "deseo lo mejor", + "Hindi": "शुभकामनाएँ", + "Arabic": "أتمنى كل التوفيق", + "Portuguese": "desejo tudo de bom", + "Bengali": "সব শুভ কামনা", + "Russian": "желаю всего наилучшего", + "Japanese": "成功を祈ります", + "Punjabi": "ਸਭ ਨੂੰ ਸ਼ੁਭਕਾਮਨਾਵਾਂ", + "Javanese": "muga-muga kabeh sing apik", + "Korean": "최선을 다하길 바랍니다", + "French": "je souhaite tout le meilleur", + "German": "wünsche dir das Beste" + }, + { + "English": "Peace", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "再见", + "Spanish": "adiós", + "Hindi": "अलविदा", + "Arabic": "مع السلامة", + "Portuguese": "adeus", + "Bengali": "বিদায়", + "Russian": "до свидания", + "Japanese": "さようなら", + "Punjabi": "ਅਲਵਿਦਾ", + "Javanese": "pamit", + "Korean": "안녕히 가세요", + "French": "au revoir", + "German": "Verabschiedung" + }, + { + "English": "Farewell", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "告别", + "Spanish": "despedirse", + "Hindi": "विदा करना", + "Arabic": "وداعا", + "Portuguese": "despedir-se", + "Bengali": "বিদায়", + "Russian": "попрощаться", + "Japanese": "さらば", + "Punjabi": "ਵਿਦਾਇਗੀ", + "Javanese": "pamitan", + "Korean": "작별을 고하다", + "French": "faire ses adieux", + "German": "Abschied nehmen" + }, + { + "English": "Good luck", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "祝好运", + "Spanish": "buena suerte", + "Hindi": "आपको कामयाबी मिले", + "Arabic": "حظ سعيد", + "Portuguese": "boa sorte", + "Bengali": "সৌভাগ্য", + "Russian": "удачи", + "Japanese": "幸運を", + "Punjabi": "ਖੁਸ਼ਕਿਸਮਤੀ", + "Javanese": "apik luck", + "Korean": "행운을 빌어요", + "French": "bonne chance", + "German": "viel Glück" + }, + { + "English": "Until next time", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "下次见", + "Spanish": "Nos vemos la próxima vez", + "Hindi": "आपसे अगली बार मिलेंगे", + "Arabic": "أراك المرة القادمة", + "Portuguese": "Vejo você na próxima vez", + "Bengali": "পরে আবার দেখা হবে", + "Russian": "Увидимся в следующий раз", + "Japanese": "次回会いましょう", + "Punjabi": "ਫੇਰ ਮਿਲਾਂਗੇ", + "Javanese": "Sampai jumpa lagi", + "Korean": "다음에 또 만나요", + "French": "À la prochaine", + "German": "Bis zum nächsten Mal" + }, + { + "English": "Best wishes", + "sceneType": "Daily greetings", + "Chinese (Simplified)": "致以最好的祝愿", + "Spanish": "Los mejores deseos", + "Hindi": "शुभकामनाएं", + "Arabic": "أطيب التمنيات", + "Portuguese": "muitas felicidades", + "Bengali": "শুভ কামনা", + "Russian": "с наилучшими пожеланиями", + "Japanese": "幸運をお祈りしています", + "Punjabi": "ਸ਼ੁਭ ਕਾਮਨਾਵਾਂ", + "Javanese": "paling wishes", + "Korean": "최고의 소원", + "French": "meilleurs vœux", + "German": "beste Wünsche" + } + ] + }, + { + "sceneSource": "Work", + "sceneType": "Work", + "sceneList":[ + { + "English": "What's your job?", + "sceneType": "Work", + "Chinese (Simplified)": "你是做什么工作的?", + "Spanish": "¿Cuál es tu trabajo?", + "Hindi": "आप क्या काम करते हैं?", + "Arabic": "ما هو عملك؟", + "Portuguese": "Qual é o seu trabalho?", + "Bengali": "তোমার কাজ কি?", + "Russian": "Кем вы работаете?", + "Japanese": "あなたの仕事は何ですか?", + "Punjabi": "ਤੁਹਾਡਾ ਕੰਮ ਕੀ ਹੈ?", + "Javanese": "Apa tugasmu?", + "Korean": "당신의 직업은 무엇입니까?", + "French": "Quel travail faites vous?", + "German": "Was arbeitest du?" + }, + { + "English": "I have a meeting", + "sceneType": "Work", + "Chinese (Simplified)": "我有一个会议", + "Spanish": "Tengo una reunión", + "Hindi": "एरी एक बैठक है", + "Arabic": "لدي إجتماع", + "Portuguese": "eu tenho uma reunião", + "Bengali": "আমার একটি বৈঠক আছে", + "Russian": "у меня встреча", + "Japanese": "会議があります", + "Punjabi": "ਮੇਰੀ ਮੁਲਾਕਾਤ ਹੈ", + "Javanese": "Aku duwe rapat", + "Korean": "회의가 있어요", + "French": "J'ai un rendez-vous", + "German": "Ich habe ein Meeting" + }, + { + "English": "Can you help me with this task?", + "sceneType": "Work", + "Chinese (Simplified)": "你能帮我完成这个任务吗?", + "Spanish": "¿Puedes ayudarme a completar esta tarea?", + "Hindi": "क्या आप इस कार्य को पूरा करने में मेरी मदद कर सकते हैं?", + "Arabic": "هل يمكنك مساعدتي في إكمال هذه المهمة؟", + "Portuguese": "Você pode me ajudar a completar esta tarefa?", + "Bengali": "আপনি আমাকে এই টাস্ক সম্পূর্ণ করতে সাহায্য করতে পারেন?", + "Russian": "Можете ли вы помочь мне выполнить это задание?", + "Japanese": "このタスクを完了するのを手伝ってくれませんか?", + "Javanese": "Apa sampeyan bisa nulungi aku ngrampungake tugas iki?", + "Korean": "이 작업을 완료하도록 도와주실 수 있나요?", + "French": "Pouvez-vous m'aider à accomplir cette tâche ?", + "German": "Können Sie mir helfen, diese Aufgabe zu erledigen?" + }, + { + "English": "I need a break", + "sceneType": "Work", + "Chinese (Simplified)": "我需要休息一下", + "Spanish": "necesito un descanso", + "Hindi": "मुझे एक ब्रेक की जरूरत है", + "Arabic": "أحتاج استراحة", + "Portuguese": "Eu preciso de um tempo", + "Bengali": "আমার একটা বিরতি দরকার", + "Russian": "мне нужен перерыв", + "Japanese": "一休みしたい", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਬ੍ਰੇਕ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku butuh istirahat", + "Korean": "나는 쉬는 시간이 필요합니다", + "French": "j'ai besoin d'une pause", + "German": "ich brauche eine Pause" + }, + { + "English": "When is the deadline?", + "sceneType": "Work", + "Chinese (Simplified)": "截止日期是什么时候?", + "Spanish": "¿Cuando es la fecha límite?", + "Hindi": "अंतिम तिथि कब है?", + "Arabic": "متى سيكون الموعد النهائى؟", + "Portuguese": "Qual é o prazo?", + "Bengali": "সময়সীমা কখন?", + "Russian": "Когда крайний срок?", + "Japanese": "期限はいつですか?", + "Punjabi": "ਅੰਤਮ ਤਾਰੀਖ ਕਦੋਂ ਹੈ?", + "Javanese": "Kapan deadline?", + "Korean": "마감일은 언제입니까?", + "French": "Quand est la date limite?", + "German": "Wann ist die Frist?" + }, + { + "English": "Let's schedule a meeting", + "sceneType": "Work", + "Chinese (Simplified)": "我们安排一个会议", + "Spanish": "Organizamos una reunión", + "Hindi": "आइए एक बैठक की व्यवस्था करें", + "Arabic": "دعونا نرتب لقاء", + "Portuguese": "Vamos marcar uma reunião", + "Bengali": "একটা মিটিং এর ব্যবস্থা করি", + "Russian": "Давайте договоримся о встрече", + "Japanese": "会議を手配しましょう", + "Punjabi": "ਆਓ ਇੱਕ ਮੀਟਿੰਗ ਦਾ ਪ੍ਰਬੰਧ ਕਰੀਏ", + "Javanese": "Ayo padha ngatur rapat", + "Korean": "회의를 준비하자", + "French": "Organisons une réunion", + "German": "Lass uns ein Treffen vereinbaren" + }, + { + "English": "Can you send me the report?", + "sceneType": "Work", + "Chinese (Simplified)": "你能给我发报告吗?", + "Spanish": "¿Puedes enviarme el informe?", + "Hindi": "क्या आप मुझे रिपोर्ट भेज सकते हैं?", + "Arabic": "هل يمكنك أن ترسل لي التقرير؟", + "Portuguese": "Você pode me enviar o relatório?", + "Bengali": "আপনি আমাকে রিপোর্ট পাঠাতে পারেন?", + "Russian": "Можете ли вы прислать мне отчет?", + "Japanese": "報告書を送ってもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੈਨੂੰ ਰਿਪੋਰਟ ਭੇਜ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa ngirim laporan?", + "Korean": "보고서를 보내주실 수 있나요?", + "French": "Pouvez-vous m'envoyer le rapport?", + "German": "Können Sie mir den Bericht schicken?" + }, + { + "English": "I need to make a phone call", + "sceneType": "Work", + "Chinese (Simplified)": "我需要打个电话", + "Spanish": "Necesito hacer una llamada", + "Hindi": "मुझे एक फ़ोन कॉल करना है", + "Arabic": "ولست بحاجة لإجراء مكالمة هاتفية", + "Portuguese": "preciso fazer uma ligação", + "Bengali": "আমাকে একটা ফোন করতে হবে", + "Russian": "мне нужно позвонить", + "Japanese": "電話する必要があります", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਫ਼ੋਨ ਕਾਲ ਕਰਨ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "aku kudu nelpon", + "Korean": "나 전화 좀 해봐야겠어", + "French": "je dois passer un appel téléphonique", + "German": "Ich muss einen Anruf machen" + }, + { + "English": "What's the status of the project?", + "sceneType": "Work", + "Chinese (Simplified)": "项目进展如何?", + "Spanish": "¿Cómo va el proyecto?", + "Hindi": "प्रोजेक्ट कैसा चल रहा है?", + "Arabic": "كيف يسير المشروع؟", + "Portuguese": "Como está indo o projeto?", + "Bengali": "প্রকল্পটি কেমন চলছে?", + "Russian": "Как продвигается проект?", + "Japanese": "プロジェクトはどう進んでいますか?", + "Punjabi": "ਪ੍ਰੋਜੈਕਟ ਕਿਵੇਂ ਚੱਲ ਰਿਹਾ ਹੈ?", + "Javanese": "Kepiye proyek kasebut?", + "Korean": "프로젝트는 어떻게 진행되고 있나요?", + "French": "Comment se déroule le projet ?", + "German": "Wie läuft das Projekt?" + }, + { + "English": "I'll send you an email", + "sceneType": "Work", + "Chinese (Simplified)": "我会给你发邮件", + "Spanish": "te enviaré un email", + "Hindi": "मैं आपको एक ईमेल भेजूंगा", + "Arabic": "سارسل لك بريدا الكترونيا", + "Portuguese": "irei mandar um email para você", + "Bengali": "আমি তোমাকে একটি ই - মেইল ​​পাঠাব", + "Russian": "Я отправлю вам электронное письмо", + "Japanese": "メールをお送りします", + "Punjabi": "ਮੈਂ ਤੁਹਾਨੂੰ ਇੱਕ ਈਮੇਲ ਭੇਜਾਂਗਾ", + "Javanese": "Aku bakal ngirim email", + "Korean": "이메일을 보내드리겠습니다", + "French": "Je vous enverrai un courriel", + "German": "Ich werde Ihnen eine E-Mail senden" + }, + { + "English": "Let's discuss this later", + "sceneType": "Work", + "Chinese (Simplified)": "我们稍后再讨论这个", + "Spanish": "Hablaremos de esto más tarde.", + "Hindi": "हम इस पर बाद में चर्चा करेंगे", + "Arabic": "سنناقش هذا لاحقا", + "Portuguese": "Discutiremos isso mais tarde", + "Bengali": "আমরা পরে এই আলোচনা করব", + "Russian": "Мы обсудим это позже", + "Japanese": "これについては後で説明します", + "Punjabi": "ਅਸੀਂ ਇਸ ਬਾਰੇ ਬਾਅਦ ਵਿੱਚ ਚਰਚਾ ਕਰਾਂਗੇ", + "Javanese": "Kita bakal ngrembug iki mengko", + "Korean": "이 문제는 나중에 논의하겠습니다.", + "French": "Nous en discuterons plus tard", + "German": "Wir werden das später besprechen" + }, + { + "English": "Can you attend the meeting?", + "sceneType": "Work", + "Chinese (Simplified)": "你能参加会议吗?", + "Spanish": "¿Puedes asistir a la reunión?", + "Hindi": "क्या आप बैठक में भाग ले सकते हैं?", + "Arabic": "هل يمكنك حضور الاجتماع؟", + "Portuguese": "Você pode participar da reunião?", + "Bengali": "আপনি মিটিং যোগ দিতে পারেন?", + "Russian": "Можете ли вы присутствовать на встрече?", + "Japanese": "会議に出席できますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੀਟਿੰਗ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa melu rapat kasebut?", + "Korean": "회의에 참석할 수 있나요?", + "French": "Pouvez-vous assister à la réunion ?", + "German": "Können Sie an der Sitzung teilnehmen?" + }, + { + "English": "I need your approval", + "sceneType": "Work", + "Chinese (Simplified)": "我需要你的批准", + "Spanish": "necesito tu aprobación", + "Hindi": "मुझे आपकी स्वीकृति चाहिए", + "Arabic": "أحتاج إلى موافقتك", + "Portuguese": "Eu preciso da sua aprovação", + "Bengali": "আমি আপনার অনুমোদন প্রয়োজন", + "Russian": "мне нужно твое одобрение", + "Japanese": "あなたの承認が必要です", + "Punjabi": "ਮੈਨੂੰ ਤੁਹਾਡੀ ਮਨਜ਼ੂਰੀ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku butuh persetujuan sampeyan", + "Korean": "당신의 승인이 필요해요", + "French": "J'ai besoin de ton approbation", + "German": "Ich brauche deine Zustimmung" + }, + { + "English": "Can we reschedule?", + "sceneType": "Work", + "Chinese (Simplified)": "我们可以改期吗?", + "Spanish": "¿Podemos reprogramar?", + "Hindi": "क्या हम पुनर्निर्धारित कर सकते हैं?", + "Arabic": "هل يمكننا إعادة الجدولة؟", + "Portuguese": "Podemos remarcar?", + "Bengali": "আমরা কি পুনঃনির্ধারণ করতে পারি?", + "Russian": "Можем ли мы перенести встречу?", + "Japanese": "スケジュールを変更できますか?", + "Punjabi": "ਕੀ ਅਸੀਂ ਦੁਬਾਰਾ ਸਮਾਂ-ਤਹਿ ਕਰ ਸਕਦੇ ਹਾਂ?", + "Javanese": "Apa kita bisa jadwal maneh?", + "Korean": "일정을 다시 정할 수 있나요?", + "French": "Pouvons-nous reprogrammer ?", + "German": "Können wir den Termin verschieben?" + }, + { + "English": "What's the priority?", + "sceneType": "Work", + "Chinese (Simplified)": "优先级是什么?", + "Spanish": "¿Cuáles son las prioridades?", + "Hindi": "प्राथमिकताएँ क्या हैं?", + "Arabic": "ما هي الأولويات؟", + "Portuguese": "Quais são as prioridades?", + "Bengali": "অগ্রাধিকার কি?", + "Russian": "Каковы приоритеты?", + "Japanese": "優先事項は何ですか?", + "Punjabi": "ਤਰਜੀਹਾਂ ਕੀ ਹਨ?", + "Javanese": "Apa sing dadi prioritas?", + "Korean": "우선순위는 무엇입니까?", + "French": "Quelles sont les priorités ?", + "German": "Was sind die Prioritäten?" + }, + { + "English": "I'll finish it by tomorrow", + "sceneType": "Work", + "Chinese (Simplified)": "我明天前完成", + "Spanish": "Lo terminaré antes de mañana.", + "Hindi": "मैं इसे कल से पहले ख़त्म कर दूंगा", + "Arabic": "سأنتهي منه قبل الغد", + "Portuguese": "Vou terminar antes de amanhã", + "Bengali": "কালকের আগেই শেষ করে ফেলব", + "Russian": "Я закончу это до завтра", + "Japanese": "明日までに終わらせます", + "Punjabi": "ਮੈਂ ਇਸਨੂੰ ਕੱਲ੍ਹ ਤੋਂ ਪਹਿਲਾਂ ਪੂਰਾ ਕਰ ਲਵਾਂਗਾ", + "Javanese": "Aku bakal rampung sadurunge sesuk", + "Korean": "내일 전에는 끝낼게요", + "French": "je le finirai avant demain", + "German": "Ich werde es vor morgen fertigstellen" + }, + { + "English": "Can you review this document?", + "sceneType": "Work", + "Chinese (Simplified)": "你能审阅一下这个文件吗?", + "Spanish": "¿Puedes revisar este documento?", + "Hindi": "क्या आप इस दस्तावेज़ की समीक्षा कर सकते हैं?", + "Arabic": "هل يمكنك مراجعة هذه الوثيقة؟", + "Portuguese": "Você pode revisar este documento?", + "Bengali": "আপনি এই নথি পর্যালোচনা করতে পারেন?", + "Russian": "Можете ли вы просмотреть этот документ?", + "Japanese": "この文書を確認していただけますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਇਸ ਦਸਤਾਵੇਜ਼ ਦੀ ਸਮੀਖਿਆ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa mriksa dokumen iki?", + "Korean": "이 문서를 검토해 주실 수 있나요?", + "French": "Pouvez-vous consulter ce document ?", + "German": "Können Sie dieses Dokument überprüfen?" + }, + { + "English": "We need to meet the deadline", + "sceneType": "Work", + "Chinese (Simplified)": "我们需要赶上截止日期", + "Spanish": "Necesitamos cumplir el plazo", + "Hindi": "हमें समय सीमा पूरी करनी होगी", + "Arabic": "نحن بحاجة إلى الوفاء بالموعد النهائي", + "Portuguese": "Precisamos cumprir o prazo", + "Bengali": "আমাদের সময়সীমা পূরণ করতে হবে", + "Russian": "Нам нужно уложиться в срок", + "Japanese": "私たちは期限を守る必要があります", + "Punjabi": "ਸਾਨੂੰ ਡੈੱਡਲਾਈਨ ਨੂੰ ਪੂਰਾ ਕਰਨ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "We kudu ketemu deadline", + "Korean": "우리는 마감일을 맞춰야 해", + "French": "Nous devons respecter le délai" + }, + { + "English": "I'll get back to you", + "sceneType": "Work", + "Chinese (Simplified)": "我会回复你", + "Spanish": "te responderé", + "Hindi": "मैं आपको उत्तर दूंगा", + "Arabic": "سأرد عليك", + "Portuguese": "eu responderei a você", + "Bengali": "আমি আপনাকে উত্তর দেব", + "Russian": "Я отвечу тебе", + "Japanese": "返信させていただきます", + "Punjabi": "ਮੈਂ ਤੁਹਾਨੂੰ ਜਵਾਬ ਦੇਵਾਂਗਾ", + "Javanese": "Aku bakal mbales sampeyan", + "Korean": "나는 당신에게 대답할 것입니다", + "French": "je te répondrai", + "German": "Ich werde Ihnen antworten" + }, + { + "English": "Let's have a quick meeting", + "sceneType": "Work", + "Chinese (Simplified)": "我们开个短会", + "Spanish": "tengamos una breve reunion", + "Hindi": "चलिए एक छोटी सी मुलाकात करते हैं", + "Arabic": "دعونا نعقد اجتماعا قصيرا", + "Portuguese": "Vamos ter uma breve reunião", + "Bengali": "আসুন একটি সংক্ষিপ্ত বৈঠক করি", + "Russian": "Давайте устроим короткую встречу", + "Japanese": "短い会議をしましょう", + "Punjabi": "ਆਓ ਇੱਕ ਛੋਟੀ ਮੁਲਾਕਾਤ ਕਰੀਏ", + "Javanese": "Ayo padha rapat singkat", + "French": "Faisons une courte réunion", + "German": "Lassen Sie uns ein kurzes Treffen vereinbaren" + }, + { + "English": "I'll update you on the progress", + "sceneType": "Work", + "Chinese (Simplified)": "我会更新你进展", + "Spanish": "Te actualizaré sobre el progreso.", + "Hindi": "मैं आपको प्रगति से अवगत कराऊंगा", + "Arabic": "سأقوم بإطلاعك على التقدم المحرز", + "Portuguese": "Vou atualizá-lo sobre o progresso", + "Bengali": "আমি আপনাকে অগ্রগতি আপডেট করব", + "Russian": "Я буду держать вас в курсе прогресса", + "Japanese": "進捗状況をお知らせします", + "Punjabi": "ਮੈਂ ਤੁਹਾਨੂੰ ਤਰੱਕੀ 'ਤੇ ਅਪਡੇਟ ਕਰਾਂਗਾ", + "Javanese": "Aku bakal nganyari sampeyan babagan kemajuan", + "Korean": "진행 상황을 업데이트하겠습니다.", + "French": "je vous tiendrai au courant de l'avancement", + "German": "Ich werde Sie über den Fortschritt auf dem Laufenden halten" + }, + { + "English": "Can you give me an update?", + "sceneType": "Work", + "Chinese (Simplified)": "你能给我更新一下吗?", + "Spanish": "¿Puedes darme una actualización?", + "Hindi": "क्या आप मुझे अपडेट दे सकते हैं?", + "Arabic": "هل يمكن أن تعطيني التحديث؟", + "Portuguese": "Você pode me dar uma atualização?", + "Bengali": "আপনি আমাকে একটি আপডেট দিতে পারেন?", + "Russian": "Можете ли вы дать мне обновленную информацию?", + "Japanese": "最新情報を教えてもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੈਨੂੰ ਇੱਕ ਅਪਡੇਟ ਦੇ ਸਕਦੇ ਹੋ?", + "Javanese": "Bisa menehi kula nganyari?", + "Korean": "최신 정보를 제공해 주실 수 있나요?", + "French": "Pouvez-vous me donner une mise à jour ?", + "German": "Können Sie mir ein Update geben?" + }, + { + "English": "I need more information", + "sceneType": "Work", + "Chinese (Simplified)": "我需要更多信息", + "Spanish": "Necesito más información", + "Hindi": "मुझे और जानकारी चाहिए", + "Arabic": "انا بحاجة الى مزيد من المعلومات", + "Portuguese": "Preciso de mais informações", + "Bengali": "আমার আরও তথ্য দরকার", + "Russian": "мне нужно больше информации", + "Japanese": "もっと詳しい情報が必要です", + "Punjabi": "ਮੈਨੂੰ ਹੋਰ ਜਾਣਕਾਰੀ ਚਾਹੀਦੀ ਹੈ", + "Javanese": "Aku butuh informasi liyane", + "Korean": "더 많은 정보가 필요해요", + "French": "J'ai besoin de plus d'informations", + "German": "Ich benötige weitere Informationen" + }, + { + "English": "Let's review the project plan", + "sceneType": "Work", + "Chinese (Simplified)": "我们来审核项目计划", + "Spanish": "Repasemos el plan del proyecto.", + "Hindi": "आइए परियोजना योजना की समीक्षा करें", + "Arabic": "دعونا نراجع خطة المشروع", + "Portuguese": "Vamos revisar o plano do projeto", + "Bengali": "এর প্রকল্প পরিকল্পনা পর্যালোচনা করা যাক", + "Russian": "Давайте рассмотрим план проекта", + "Japanese": "プロジェクト計画を見直してみましょう", + "Punjabi": "ਆਉ ਪ੍ਰੋਜੈਕਟ ਯੋਜਨਾ ਦੀ ਸਮੀਖਿਆ ਕਰੀਏ", + "Javanese": "Ayo dideleng rencana proyek", + "French": "Passons en revue le plan du projet", + "German": "Sehen wir uns den Projektplan an" + }, + { + "English": "Can you take notes?", + "sceneType": "Work", + "Chinese (Simplified)": "你能做记录吗?", + "Spanish": "¿Puedes grabarlo?", + "Arabic": "هل يمكنك تسجيله؟", + "Portuguese": "Você pode gravar?", + "Bengali": "আপনি এটা রেকর্ড করতে পারেন?", + "Russian": "Можете ли вы это записать?", + "Japanese": "録音してもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਰਿਕਾਰਡ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa ngrekam?", + "Korean": "녹음해 주실 수 있나요?", + "French": "Pouvez-vous l'enregistrer ?", + "German": "Kannst du es aufnehmen?" + }, + { + "English": "I have a deadline", + "sceneType": "Work", + "Chinese (Simplified)": "我有一个截止日期", + "Spanish": "tengo una fecha límite", + "Hindi": "मेरे पास एक समयसीमा है", + "Arabic": "لدي موعد نهائي", + "Portuguese": "Eu tenho um prazo", + "Bengali": "আমার একটা সময়সীমা আছে", + "Russian": "у меня есть срок", + "Japanese": "期限があります", + "Punjabi": "ਮੇਰੇ ਕੋਲ ਸਮਾਂ ਸੀਮਾ ਹੈ", + "Javanese": "Aku duwe deadline", + "Korean": "마감일이 있어요", + "French": "j'ai un délai", + "German": "Ich habe eine Frist" + }, + { + "English": "Let's finalize the details", + "sceneType": "Work", + "Chinese (Simplified)": "我们来敲定细节", + "Spanish": "ultimamos los detalles", + "Hindi": "आइए विवरण को अंतिम रूप दें", + "Arabic": "دعونا نضع اللمسات الأخيرة على التفاصيل", + "Portuguese": "Vamos finalizar os detalhes", + "Russian": "Давайте доработаем детали", + "Japanese": "詳細を決めましょう", + "Punjabi": "ਆਓ ਵੇਰਵਿਆਂ ਨੂੰ ਅੰਤਿਮ ਰੂਪ ਦੇਈਏ", + "Javanese": "Ayo rampung rincian", + "Korean": "세부 사항을 마무리합시다", + "French": "Finalisons les détails", + "German": "Lassen Sie uns die Details finalisieren" + }, + { + "English": "Can you help me with this?", + "sceneType": "Work", + "Chinese (Simplified)": "你能帮我吗?", + "Spanish": "¿Me puedes ayudar?", + "Hindi": "क्या आप मेरी मदद कर सकते हैं?", + "Arabic": "هل بإمكانك مساعدتي؟", + "Portuguese": "Pode me ajudar?", + "Bengali": "আপনি কি আমাকে সাহায্য করতে পারেন?", + "Russian": "Вы можете помочь мне?", + "Japanese": "手伝ってもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀ ਮੇਰੀ ਮਦਦ ਕਰ ਸੱਕਦੇ ਹੋ?", + "Javanese": "Isa nulungi aku ora?", + "Korean": "도와주세요?", + "French": "Pouvez-vous m'aider?", + "German": "Kannst du mir helfen?" + }, + { + "English": "We need to finish this today", + "sceneType": "Work", + "Chinese (Simplified)": "我们今天要完成这个", + "Spanish": "vamos a terminar esto hoy", + "Hindi": "हम इसे आज समाप्त करने जा रहे हैं", + "Arabic": "ونحن في طريقنا لإنهاء هذا اليوم", + "Portuguese": "vamos terminar isso hoje", + "Bengali": "আমরা আজ এটি শেষ করতে যাচ্ছি", + "Russian": "мы собираемся закончить это сегодня", + "Japanese": "今日はこれを終わらせるつもりです", + "Punjabi": "ਅਸੀਂ ਅੱਜ ਇਸ ਨੂੰ ਪੂਰਾ ਕਰਨ ਜਾ ਰਹੇ ਹਾਂ", + "Javanese": "kita bakal rampung dina iki", + "Korean": "오늘은 이것으로 끝내겠습니다", + "French": "nous allons finir ça aujourd'hui", + "German": "Wir werden das heute zu Ende bringen" + }, + { + "English": "I'll send you the details", + "sceneType": "Work", + "Chinese (Simplified)": "我会发你详细信息", + "Spanish": "te enviaré los detalles", + "Hindi": "मैं आपको विवरण भेजूंगा", + "Arabic": "سأرسل لك التفاصيل", + "Portuguese": "vou te enviar os detalhes", + "Bengali": "আমি আপনাকে বিস্তারিত পাঠাব", + "Russian": "Я пришлю вам подробности", + "Japanese": "詳細をお送りします", + "Punjabi": "ਮੈਂ ਤੁਹਾਨੂੰ ਵੇਰਵੇ ਭੇਜਾਂਗਾ", + "Javanese": "Aku bakal ngirim rincian", + "Korean": "자세한 내용을 보내드리겠습니다.", + "French": "je t'enverrai les détails", + "German": "Ich werde Ihnen die Details zusenden" + }, + { + "English": "Can you meet the deadline?", + "sceneType": "Work", + "Chinese (Simplified)": "你能赶上截止日期吗?", + "Spanish": "¿Podrás cumplir con el plazo?", + "Hindi": "क्या आप समय सीमा को पूरा कर सकते हैं?", + "Portuguese": "Você consegue cumprir o prazo?", + "Bengali": "আপনি সময়সীমা পূরণ করতে পারেন?", + "Russian": "Сможете ли вы уложиться в срок?", + "Japanese": "締め切りは守れますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਅੰਤਮ ਤਾਰੀਖ ਨੂੰ ਪੂਰਾ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Bisa ketemu deadline?", + "Korean": "마감일을 지킬 수 있나요?", + "French": "Pouvez-vous respecter le délai ?", + "German": "Können Sie die Frist einhalten?" + }, + { + "English": "I have a question", + "sceneType": "Work", + "Chinese (Simplified)": "我有个问题", + "Spanish": "Tengo una pregunta", + "Hindi": "मेरा एक सवाल है", + "Arabic": "عندي سؤال", + "Portuguese": "Eu tenho uma pergunta", + "Bengali": "আমার একটা প্রশ্ন আছে", + "Russian": "У меня есть вопрос", + "Japanese": "質問があります", + "Punjabi": "ਮੇਰੇ ਕੋਲ ਇੱਕ ਸਵਾਲ ਹੈ", + "Javanese": "Aku duwe pitakonan", + "Korean": "질문이 있어요", + "German": "Ich habe eine Frage" + }, + { + "English": "Let's work on this together", + "sceneType": "Work", + "Chinese (Simplified)": "我们一起做这个", + "Spanish": "hagamos esto juntos", + "Hindi": "आइए इसे एक साथ करें", + "Arabic": "دعونا نفعل هذا معا", + "Portuguese": "vamos fazer isso juntos", + "Bengali": "আসুন একসাথে এটি করি", + "Russian": "давай сделаем это вместе", + "Japanese": "一緒にやりましょう", + "Punjabi": "ਆਓ ਇਸ ਨੂੰ ਇਕੱਠੇ ਕਰੀਏ", + "Javanese": "ayo padha nindakake iki bebarengan", + "Korean": "이거 같이 하자", + "French": "faisons ça ensemble", + "German": "lasst uns das gemeinsam machen" + }, + { + "English": "I need to follow up", + "sceneType": "Work", + "Chinese (Simplified)": "我需要跟进", + "Spanish": "necesito hacer un seguimiento", + "Hindi": "मुझे अनुवर्ती कार्रवाई करने की आवश्यकता है", + "Arabic": "أنا بحاجة للمتابعة", + "Portuguese": "preciso acompanhar", + "Bengali": "আমি অনুসরণ করতে হবে", + "Russian": "мне нужно следить", + "Japanese": "フォローアップする必要があります", + "Punjabi": "ਮੈਨੂੰ ਫਾਲੋ-ਅੱਪ ਕਰਨ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Aku kudu ngetutake", + "Korean": "후속조치가 필요해요", + "French": "je dois faire un suivi", + "German": "Ich muss dem nachgehen" + }, + { + "English": "What's the next step?", + "sceneType": "Work", + "Chinese (Simplified)": "下一步是什么?", + "Spanish": "¿Que sigue?", + "Hindi": "आगे क्या होगा?", + "Arabic": "ماذا بعد؟", + "Portuguese": "Qual é o próximo?", + "Bengali": "এরপর কি?", + "Russian": "Что дальше?", + "Japanese": "次は何ですか?", + "Punjabi": "ਅੱਗੇ ਕੀ ਹੈ?", + "Javanese": "Apa sabanjure?", + "Korean": "무엇 향후 계획?", + "French": "Et après?", + "German": "Was kommt als nächstes?" + }, + { + "English": "I'll check back with you", + "sceneType": "Work", + "Chinese (Simplified)": "我会再联系你", + "Spanish": "te contactaré nuevamente", + "Hindi": "मैं आपसे दोबारा संपर्क करूंगा", + "Arabic": "سأتصل بك مرة أخرى", + "Portuguese": "Entrarei em contato com você novamente", + "Bengali": "আমি আবার আপনার সাথে যোগাযোগ করব", + "Russian": "Я свяжусь с тобой снова", + "Japanese": "改めてご連絡させていただきます", + "Punjabi": "ਮੈਂ ਤੁਹਾਡੇ ਨਾਲ ਦੁਬਾਰਾ ਸੰਪਰਕ ਕਰਾਂਗਾ", + "Javanese": "Aku bakal hubungi sampeyan maneh", + "Korean": "다시 연락드리겠습니다", + "French": "je vous recontacterai", + "German": "Ich werde Sie wieder kontaktieren" + }, + { + "English": "Let's take a break", + "sceneType": "Work", + "Chinese (Simplified)": "我们休息一下", + "Spanish": "tomemos un descanso", + "Hindi": "चलो एक ब्रेक लेते है", + "Arabic": "دعونا نأخذ قسطا من الراحة", + "Portuguese": "vamos fazer uma pausa", + "Bengali": "এর একটি বিরতি নিয়ে দিন", + "Russian": "давай возьмем перерыв", + "Japanese": "休憩しましょう", + "Punjabi": "ਆਓ ਇੱਕ ਬ੍ਰੇਕ ਕਰੀਏ", + "Javanese": "ayo padha ngaso", + "Korean": "좀 쉬자", + "French": "faisons une pause", + "German": "Lasst uns eine Pause machen" + }, + { + "English": "Can you handle this?", + "sceneType": "Work", + "Chinese (Simplified)": "你能处理这个吗?", + "Spanish": "¿Puedes manejar esto?", + "Hindi": "क्या तुम इसको संभाल सकते हो?", + "Arabic": "هل تستطيع التعامل مع هذا؟", + "Portuguese": "Você pode lidar com isso?", + "Bengali": "তুমি কি এটা সামলাতে পারবে?", + "Russian": "Сможешь ли ты справиться с этим?", + "Japanese": "あなたはこれを扱えますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਇਸ ਨੂੰ ਸੰਭਾਲ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa ngatasi iki?", + "Korean": "이걸 처리할 수 있나요?", + "French": "Pouvez-vous gérer ceci?", + "German": "Kannst du damit umgehen?" + }, + { + "English": "We need to focus on this", + "sceneType": "Work", + "Chinese (Simplified)": "我们需要关注这个", + "Spanish": "Necesitamos centrarnos en esto.", + "Hindi": "हमें इस पर ध्यान देने की जरूरत है", + "Arabic": "نحن بحاجة إلى التركيز على هذا", + "Portuguese": "Precisamos nos concentrar nisso", + "Bengali": "আমাদের এই বিষয়ে ফোকাস করতে হবে", + "Russian": "Нам нужно сосредоточиться на этом", + "Japanese": "これに集中する必要があります", + "Punjabi": "ਸਾਨੂੰ ਇਸ 'ਤੇ ਧਿਆਨ ਦੇਣ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "Kita kudu fokus ing iki", + "Korean": "우리는 이것에 집중해야 합니다.", + "French": "Nous devons nous concentrer sur cela", + "German": "Darauf müssen wir uns konzentrieren" + }, + { + "English": "I'll prepare the presentation", + "sceneType": "Work", + "Chinese (Simplified)": "我会准备演示", + "Spanish": "prepararé una presentación", + "Hindi": "मैं एक प्रेजेंटेशन तैयार करूंगा", + "Arabic": "سأقوم بإعداد عرض تقديمي", + "Portuguese": "Vou preparar uma apresentação", + "Bengali": "আমি একটি উপস্থাপনা প্রস্তুত করব", + "Russian": "Я подготовлю презентацию", + "Japanese": "プレゼンテーションの準備をします", + "Punjabi": "ਮੈਂ ਇੱਕ ਪੇਸ਼ਕਾਰੀ ਤਿਆਰ ਕਰਾਂਗਾ", + "Javanese": "Aku bakal nyiapake presentasi", + "Korean": "발표 준비할게", + "French": "je vais préparer une présentation", + "German": "Ich bereite eine Präsentation vor" + }, + { + "English": "Can you provide feedback?", + "sceneType": "Work", + "Chinese (Simplified)": "你能提供反馈吗?", + "Spanish": "¿Puedes darnos tu opinión?", + "Hindi": "क्या आप प्रतिक्रिया दे सकते हैं?", + "Arabic": "هل يمكنك تقديم ردود الفعل؟", + "Portuguese": "Você pode fornecer feedback?", + "Bengali": "আপনি প্রতিক্রিয়া দিতে পারেন?", + "Russian": "Можете ли вы предоставить обратную связь?", + "Japanese": "フィードバックをいただけますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਫੀਡਬੈਕ ਦੇ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa menehi saran?", + "Korean": "피드백을 제공해 주실 수 있나요?", + "French": "Pouvez-vous fournir des commentaires ?", + "German": "Können Sie Feedback geben?" + }, + { + "English": "I need to talk to you", + "sceneType": "Work", + "Chinese (Simplified)": "我需要和你谈", + "Spanish": "necesito hablar contigo", + "Hindi": "मुझे आपसे बात करनी है", + "Arabic": "أحتاج لأن أتحدث إليك", + "Portuguese": "eu preciso falar com você", + "Bengali": "আপনার সাথে আমার কথা বলা দরকার", + "Russian": "мне надо поговорить с тобой", + "Japanese": "私はあなたに話す必要があります", + "Punjabi": "ਮੈਨੂੰ ਤੁਹਾਡੇ ਨਾਲ ਗੱਲ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ", + "Javanese": "aku kudu ngomong karo kowe", + "Korean": "너랑 얘기 좀 해야겠어", + "French": "j'ai besoin de te parler", + "German": "Ich muss mit Ihnen reden" + }, + { + "English": "Let's set up a meeting", + "sceneType": "Work", + "Chinese (Simplified)": "我们安排一个会议", + "Spanish": "Organizamos una reunión", + "Hindi": "आइए एक बैठक की व्यवस्था करें", + "Portuguese": "Vamos marcar uma reunião", + "Bengali": "একটা মিটিং এর ব্যবস্থা করি", + "Russian": "Давайте договоримся о встрече", + "Japanese": "会議を手配しましょう", + "Punjabi": "ਆਓ ਇੱਕ ਮੀਟਿੰਗ ਦਾ ਪ੍ਰਬੰਧ ਕਰੀਏ", + "Javanese": "Ayo padha ngatur rapat", + "Korean": "회의를 준비하자", + "French": "Organisons une réunion", + "German": "Lass uns ein Treffen vereinbaren" + }, + { + "English": "I'll send the invitation", + "sceneType": "Work", + "Chinese (Simplified)": "我会发送邀请", + "Spanish": "enviaré una invitación", + "Hindi": "मैं निमंत्रण भेजूंगा", + "Arabic": "سأرسل الدعوة", + "Portuguese": "vou enviar convite", + "Bengali": "আমি আমন্ত্রণ পাঠাব", + "Japanese": "招待状を送ります", + "Punjabi": "ਮੈਂ ਸੱਦਾ ਭੇਜਾਂਗਾ", + "Javanese": "Aku bakal ngirim undhangan", + "Korean": "초대장을 보내겠습니다", + "French": "j'enverrai une invitation", + "German": "Ich werde eine Einladung senden" + }, + { + "English": "Can you complete this task?", + "sceneType": "Work", + "Chinese (Simplified)": "你能完成这个任务吗?", + "Spanish": "¿Podrás completar esta tarea?", + "Hindi": "क्या आप यह कार्य पूरा कर सकते हैं?", + "Arabic": "هل يمكنك إكمال هذه المهمة؟", + "Portuguese": "Você pode completar esta tarefa?", + "Bengali": "আপনি এই টাস্ক সম্পূর্ণ করতে পারেন?", + "Russian": "Сможете ли вы выполнить это задание?", + "Japanese": "このタスクを完了できますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਇਸ ਕੰਮ ਨੂੰ ਪੂਰਾ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa ngrampungake tugas iki?", + "Korean": "이 작업을 완료할 수 있나요?", + "French": "Pouvez-vous accomplir cette tâche ?", + "German": "Können Sie diese Aufgabe erledigen?" + }, + { + "English": "We need to discuss this", + "sceneType": "Work", + "Chinese (Simplified)": "我们需要讨论这个", + "Spanish": "tenemos que discutir esto", + "Hindi": "हमें इस पर चर्चा करने की जरूरत है", + "Arabic": "نحن بحاجة لمناقشة هذا", + "Portuguese": "precisamos discutir isso", + "Bengali": "আমাদের এই নিয়ে আলোচনা করা দরকার", + "Russian": "нам нужно обсудить это", + "Japanese": "私たちはこれについて話し合う必要があります", + "Punjabi": "ਸਾਨੂੰ ਇਸ ਬਾਰੇ ਚਰਚਾ ਕਰਨ ਦੀ ਲੋੜ ਹੈ", + "Javanese": "kita kudu ngrembug iki", + "Korean": "우리는 이것에 대해 논의해야 해요", + "French": "nous devons en discuter" + }, + { + "English": "I'll share the document", + "sceneType": "Work", + "Chinese (Simplified)": "我会分享文件", + "Spanish": "compartiré archivos", + "Hindi": "मैं फ़ाइलें साझा करूंगा", + "Arabic": "سوف أشارك الملفات", + "Portuguese": "vou compartilhar arquivos", + "Bengali": "আমি ফাইল শেয়ার করব", + "Russian": "поделюсь файлами", + "Japanese": "ファイルを共有します", + "Punjabi": "ਮੈਂ ਫਾਈਲਾਂ ਸਾਂਝੀਆਂ ਕਰਾਂਗਾ", + "Javanese": "Aku bakal nuduhake file", + "Korean": "파일을 공유하겠습니다", + "French": "je partagerai des fichiers", + "German": "Ich werde Dateien teilen" + } + ] + }, + { + "sceneSource": "Transportation", + "sceneType": "Transportation", + "sceneList": [ + { + "English": "Where is the bus stop?", + "sceneType": "Transportation", + "Chinese (Simplified)": "公交车站在哪里?", + "Spanish": "¿Dónde esta la parada de autobus?", + "Hindi": "बस स्टॉप कहाँ है?", + "Arabic": "أين هي محطة للحافلات؟", + "Portuguese": "Onde é o ponto de ônibus?", + "Bengali": "যেখানে বাস স্টপ?", + "Russian": "Где автобусная остановка?", + "Japanese": "バス停はどこですか?", + "Punjabi": "ਬੱਸ ਅੱਡਾ ਕਿੱਥੇ ਹੈ?", + "Javanese": "Halte bis ngendi?", + "Korean": "버스 정류장이 어디에 있는가?", + "French": "Où est l'arrêt de bus?", + "German": "Wo ist die Bushaltestelle?" + }, + { + "English": "I need a taxi", + "sceneType": "Transportation", + "Chinese (Simplified)": "我需要一辆出租车", + "Spanish": "necesito un taxi", + "Hindi": "मुझे एक टैक्सी चाहिए", + "Arabic": "احتاج سيارة اجرة", + "Portuguese": "Eu preciso de um táxi", + "Bengali": "আমার একটা ট্যাক্সি দরকার", + "Russian": "мне нужно такси", + "Japanese": "タクシーが必要です", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਟੈਕਸੀ ਚਾਹੀਦੀ ਹੈ", + "Javanese": "aku butuh taksi", + "Korean": "택시가 필요해", + "French": "j'ai besoin d'un taxi", + "German": "ich brauche ein Taxi" + }, + { + "English": "How much is the fare?", + "sceneType": "Transportation", + "Chinese (Simplified)": "车费多少钱?", + "Spanish": "¿Cuanto es lo justo?", + "Hindi": "कितना किराया है?", + "Arabic": "كم هو الأجرة؟", + "Portuguese": "Quanto é a tarifa?", + "Bengali": "ভাড়া কত?", + "Russian": "Сколько стоит проезд?", + "Japanese": "運賃はいくらですか?", + "Punjabi": "ਕਿਰਾਇਆ ਕਿੰਨਾ ਹੈ?", + "Javanese": "Pira regane?", + "Korean": "요금은 얼마인가요?", + "French": "Combien coûte le tarif ?", + "German": "Wie hoch ist der Fahrpreis?" + }, + { + "English": "Can you take me to the airport?", + "sceneType": "Transportation", + "Chinese (Simplified)": "你能送我去机场吗?", + "Spanish": "¿Puedes llevarme al aeropuerto?", + "Hindi": "क्या आप मुझे हवाई अड्डे तक ले जा सकते हैं?", + "Arabic": "هل يمكنك أن تأخذني إلى المطار؟", + "Portuguese": "Você pode me levar ao aeroporto?", + "Bengali": "আপনি কি আমাকে এয়ারপোর্টে নিয়ে যেতে পারবেন?", + "Russian": "Ты можешь отвезти меня в аэропорт?", + "Japanese": "空港まで連れて行ってもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੈਨੂੰ ਏਅਰਪੋਰਟ ਲੈ ਜਾ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa ngeterake aku menyang bandara?", + "Korean": "저를 공항까지 데려다 주실 수 있나요?", + "French": "Pouvez-vous m'emmener à l'aéroport ?", + "German": "Können Sie mich zum Flughafen bringen?" + }, + { + "English": "I missed my train", + "sceneType": "Transportation", + "Chinese (Simplified)": "我错过了火车", + "Spanish": "Perdí el tren", + "Hindi": "मेरी ट्रेन छूट गई", + "Arabic": "فاتني القطار. متى يغادر التالي", + "Portuguese": "Perdi o trem", + "Bengali": "আমি ট্রেন মিস করেছি", + "Russian": "Я опоздал на поезд", + "Japanese": "列車に乗り遅れました", + "Punjabi": "ਮੇਰੀ ਟ੍ਰੇਨ ਛੁੱਟ ਗਈ", + "Javanese": "Aku ora kejawab sepur", + "Korean": "기차를 놓쳤어요", + "French": "J'ai manqué le train", + "German": "Ich habe den Zug verpasst" + }, + { + "English": "Where is the subway station?", + "sceneType": "Transportation", + "Chinese (Simplified)": "地铁站在哪里?", + "Spanish": "¿Dónde está la estación de metro?", + "Hindi": "सबवे स्टेशन कहां पर है?", + "Arabic": "أين هي محطة مترو الانفاق؟", + "Portuguese": "Onde é a estação de metrô?", + "Bengali": "পাতাল রেল স্টেশন কোথায়?", + "Russian": "Где находится станция метро?", + "Japanese": "地下鉄の駅はどこですか?", + "Punjabi": "ਮੇਟਰੋ ਸਟੇਸ਼ਨ ਕਿੱਥੇ ਹੈ?", + "Javanese": "Endi stasiun sepur?", + "Korean": "지하철역은 어디에 있나요?", + "French": "Où est la station de métro?", + "German": "Wo ist die U-Bahn Haltestelle?" + }, + { + "English": "How do I get to the city center?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我怎么去市中心?", + "Spanish": "¿Cómo llego al centro de la ciudad?", + "Hindi": "मैं शहर के केंद्र तक कैसे पहुँचूँ?", + "Arabic": "كيف أصل إلى وسط المدينة؟", + "Portuguese": "Como chego ao centro da cidade?", + "Bengali": "আমি কিভাবে শহরের কেন্দ্রে যেতে পারি?", + "Russian": "Как мне добраться до центра города?", + "Japanese": "市内中心部へはどうやって行けますか?", + "Punjabi": "ਮੈਂ ਸ਼ਹਿਰ ਦੇ ਕੇਂਦਰ ਤੱਕ ਕਿਵੇਂ ਪਹੁੰਚਾਂ?", + "Javanese": "Kepiye carane aku menyang pusat kutha?", + "Korean": "시내 중심가까지는 어떻게 가나요?", + "French": "Comment puis-je me rendre au centre-ville ?", + "German": "Wie komme ich in die Innenstadt?" + }, + { + "English": "Can I get a ticket to downtown?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我可以买到市中心的票吗?", + "Spanish": "¿Puedo comprar entradas para el centro de la ciudad?", + "Hindi": "क्या मैं सिटी सेंटर के लिए टिकट खरीद सकता हूँ?", + "Arabic": "هل يمكنني شراء تذاكر لوسط المدينة؟", + "Portuguese": "Posso comprar ingressos para o centro da cidade?", + "Bengali": "আমি কি শহরের কেন্দ্রের জন্য টিকিট কিনতে পারি?", + "Russian": "Могу ли я купить билеты в центр города?", + "Japanese": "市内中心部のチケットは購入できますか?", + "Punjabi": "ਕੀ ਮੈਂ ਸਿਟੀ ਸੈਂਟਰ ਲਈ ਟਿਕਟਾਂ ਖਰੀਦ ਸਕਦਾ\/ਸਕਦੀ ਹਾਂ?", + "Javanese": "Bisa tuku tiket kanggo pusat kutha?", + "Korean": "시내 중심가 티켓을 살 수 있나요?", + "French": "Puis-je acheter des billets pour le centre-ville ?", + "German": "Kann ich Tickets für die Innenstadt kaufen?" + }, + { + "English": "Is there a bus to the airport?", + "sceneType": "Transportation", + "Chinese (Simplified)": "有去机场的公交车吗?", + "Spanish": "¿Hay un autobús al aeropuerto?", + "Hindi": "क्या हवाई अड्डे के लिए कोई बस है?", + "Arabic": "هل هناك حافلة إلى المطار؟", + "Portuguese": "Existe um ônibus para o aeroporto?", + "Bengali": "বিমানবন্দরে কি বাস আছে?", + "Russian": "Есть ли автобус до аэропорта?", + "Japanese": "空港行きのバスはありますか?", + "Punjabi": "ਕੀ ਹਵਾਈ ਅੱਡੇ ਲਈ ਕੋਈ ਬੱਸ ਹੈ?", + "Javanese": "Apa ana bis menyang bandara?", + "Korean": "공항까지 가는 버스가 있나요?", + "French": "Y a-t-il un bus pour l'aéroport ?", + "German": "Gibt es einen Bus zum Flughafen?" + }, + { + "English": "What time does the bus leave?", + "sceneType": "Transportation", + "Chinese (Simplified)": "公交车几点出发?", + "Spanish": "¿A qué hora sale el autobús?", + "Hindi": "बस कितनी बजे प्रस्थान करती है?", + "Arabic": "متى تغادر الحافلة؟", + "Portuguese": "A que horas o ônibus sai?", + "Bengali": "বাস কি সময় ছাড়বে?", + "Russian": "Во сколько отходит автобус?", + "Japanese": "バスは何時に出ますか?", + "Punjabi": "ਬੱਸ ਕਿੰਨੇ ਵਜੇ ਰਵਾਨਾ ਹੁੰਦੀ ਹੈ?", + "Javanese": "Jam pira bis budhal?", + "Korean": "버스는 몇시에 출발하나요?", + "French": "A quelle heure part le bus?", + "German": "Um wie viel Uhr fährt der Bus ab?" + }, + { + "English": "Where can I buy a ticket?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我在哪里可以买票?", + "Spanish": "¿Dónde puedo comprar las entradas?", + "Hindi": "मैं टिकट कहाँ से खरीद सकता हूँ?", + "Arabic": "أين يمكنني شراء التذاكر؟", + "Portuguese": "Onde posso comprar os bilhetes?", + "Bengali": "আমি কোথায় টিকিট কিনতে পারি?", + "Russian": "Где я могу купить билеты?", + "Japanese": "チケットはどこで買えますか?", + "Punjabi": "ਮੈਂ ਟਿਕਟਾਂ ਕਿਥੋਂ ਖ਼ਰੀਦ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Ing endi bisa tuku tiket?", + "Korean": "티켓은 어디서 살 수 있나요?", + "French": "Où puis-je acheter des billets?", + "German": "Wo kann ich Tickets kaufen?" + }, + { + "English": "How long is the ride?", + "sceneType": "Transportation", + "Chinese (Simplified)": "车程多长时间?", + "Spanish": "¿Cuánto dura el viaje?", + "Hindi": "ड्राइव कितनी लंबी है?", + "Arabic": "كم هي مدة القيادة؟", + "Portuguese": "Quanto tempo dura a viagem?", + "Bengali": "ড্রাইভ কতক্ষণ?", + "Russian": "Сколько времени занимает поездка?", + "Japanese": "ドライブはどれくらいですか?", + "Punjabi": "ਡਰਾਈਵ ਕਿੰਨੀ ਲੰਬੀ ਹੈ?", + "Javanese": "Suwene drive?", + "Korean": "운전 시간은 얼마나 되나요?", + "French": "Quelle est la durée du trajet ?", + "German": "Wie lang ist die Fahrt?" + }, + { + "English": "Can I get a round-trip ticket?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我可以买往返票吗?", + "Spanish": "¿Puedo comprar un billete de ida y vuelta?", + "Hindi": "क्या मैं राउंड ट्रिप टिकट खरीद सकता हूँ?", + "Arabic": "هل يمكنني شراء تذكرة ذهاب وإياب؟", + "Portuguese": "Posso comprar uma passagem de ida e volta?", + "Bengali": "আমি কি রাউন্ড ট্রিপের টিকিট কিনতে পারি?", + "Russian": "Могу ли я купить билет туда и обратно?", + "Japanese": "往復の航空券を購入できますか?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਕ ਰਾਊਂਡ ਟ੍ਰਿਪ ਟਿਕਟ ਖਰੀਦ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Bisa tuku tiket round trip?", + "Korean": "왕복 티켓을 구입할 수 있나요?", + "French": "Puis-je acheter un billet aller-retour ?", + "German": "Kann ich ein Hin- und Rückflugticket kaufen?" + }, + { + "English": "Where is the taxi stand?", + "sceneType": "Transportation", + "Chinese (Simplified)": "出租车站在哪里?", + "Spanish": "¿Dónde está la parada de taxis?", + "Hindi": "टैक्सी स्टैंड कहां है?", + "Arabic": "أين تقف سيارة الأجرة؟", + "Portuguese": "Onde fica o ponto de táxi?", + "Bengali": "ট্যাক্সি স্ট্যান্ড কোথায়?", + "Russian": "Где здесь стоянка такси?", + "Japanese": "タクシー乗り場はどこにありますか?", + "Punjabi": "ਟੈਕਸੀ ਸਟੈਂਡ ਕਿਥੇ ਹੈ?", + "Javanese": "Ing endi stasiun taksi?", + "Korean": "택시 승강장은 어디에 있나요?", + "French": "Où est la station de taxis?", + "German": "Wo ist der Taxistand?" + }, + { + "English": "Can I get a map of the subway?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我可以要一张地铁地图吗?", + "Spanish": "¿Puedo tener un mapa del metro?", + "Hindi": "क्या मेरे पास सबवे मानचित्र हो सकता है?", + "Arabic": "هل يمكنني الحصول على خريطة مترو الانفاق؟", + "Portuguese": "Posso ter um mapa do metrô?", + "Bengali": "আমি একটি পাতাল রেল মানচিত্র পেতে পারি?", + "Russian": "Можно мне карту метро?", + "Japanese": "地下鉄の路線図をもらえますか?", + "Punjabi": "ਕੀ ਮੇਰੇ ਕੋਲ ਸਬਵੇਅ ਦਾ ਨਕਸ਼ਾ ਹੈ?", + "Javanese": "Apa aku bisa duwe peta subway?", + "Korean": "지하철 노선도를 얻을 수 있나요?", + "French": "Puis-je avoir un plan du métro ?", + "German": "Kann ich einen U-Bahn-Plan haben?" + }, + { + "English": "What is the next stop?", + "sceneType": "Transportation", + "Chinese (Simplified)": "下一站是什么?", + "Spanish": "¿Cuál es la próxima parada?", + "Hindi": "अगला पड़ाव क्या है?", + "Arabic": "ما هي المحطة التالية؟", + "Portuguese": "Qual é a próxima parada?", + "Bengali": "পরবর্তী স্টপ কি?", + "Russian": "Какая следующая остановка?", + "Japanese": "次の停留所は何ですか?", + "Punjabi": "ਅਗਲਾ ਸਟਾਪ ਕੀ ਹੈ?", + "Javanese": "Apa mandeg sabanjure?", + "Korean": "다음 정거장은 어디인가요?", + "French": "Quel est le prochain arrêt ?", + "German": "Was ist der nächste Halt?" + }, + { + "English": "Can I rent a car here?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我可以在这里租车吗?", + "Spanish": "¿Puedo alquilar un coche aquí?", + "Hindi": "क्या मैं यहाँ कार किराये पर ले सकता हूँ?", + "Arabic": "هل يمكنني استئجار سيارة هنا؟", + "Portuguese": "Posso alugar um carro aqui?", + "Bengali": "আমি কি এখানে গাড়ি ভাড়া করতে পারি?", + "Russian": "Могу ли я арендовать здесь машину?", + "Japanese": "ここでレンタカーを借りてもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਥੇ ਕਾਰ ਕਿਰਾਏ 'ਤੇ ਲੈ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa nyewa mobil ing kene?", + "Korean": "여기서 차를 빌릴 수 있나요?", + "French": "Puis-je louer une voiture ici ?", + "German": "Kann ich hier ein Auto mieten?" + }, + { + "English": "Is this the right bus for the museum?", + "sceneType": "Transportation", + "Chinese (Simplified)": "这是去博物馆的正确公交车吗?", + "Spanish": "¿Es este el autobús adecuado para ir al museo?", + "Hindi": "क्या संग्रहालय जाने के लिए यह सही बस है?", + "Arabic": "هل هذه هي الحافلة المناسبة للذهاب إلى المتحف؟", + "Portuguese": "Este é o ônibus certo para ir ao museu?", + "Bengali": "জাদুঘরে যাওয়ার জন্য এটাই কি সঠিক বাস?", + "Russian": "Это тот самый автобус, на котором можно поехать в музей?", + "Japanese": "これは博物館に行くのに正しいバスですか?", + "Punjabi": "ਕੀ ਅਜਾਇਬ ਘਰ ਜਾਣ ਲਈ ਇਹ ਸਹੀ ਬੱਸ ਹੈ?", + "Javanese": "Apa iki bis sing pas kanggo pindhah menyang museum?", + "Korean": "이 버스가 박물관에 가는 데 맞는 버스인가요?", + "French": "Est-ce le bon bus pour aller au musée ?", + "German": "Ist das der richtige Bus, um zum Museum zu fahren?" + }, + { + "English": "How often does the bus come?", + "sceneType": "Transportation", + "Chinese (Simplified)": "公交车多久一班?", + "Spanish": "¿Con qué frecuencia pasa el autobús?", + "Hindi": "बस कितनी बार चलती है?", + "Arabic": "كم مرة تعمل الحافلة؟", + "Portuguese": "Com que frequência o ônibus circula?", + "Bengali": "বাস কত ঘন ঘন চলে?", + "Russian": "Как часто ходит автобус?", + "Japanese": "バスはどれくらいの頻度で運行していますか?", + "Punjabi": "ਬੱਸ ਕਿੰਨੀ ਵਾਰ ਚੱਲਦੀ ਹੈ?", + "Javanese": "Sepira kerepe bis mlaku?", + "Korean": "버스는 얼마나 자주 운행되나요?", + "French": "À quelle fréquence le bus circule-t-il ?", + "German": "Wie oft fährt der Bus?" + }, + { + "English": "Do I need to transfer?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我需要换乘吗?", + "Spanish": "¿Tengo que cambiar de tren?", + "Hindi": "क्या मुझे ट्रेनें बदलनी होंगी?", + "Arabic": "هل أحتاج لتغيير القطارات؟", + "Portuguese": "Preciso trocar de trem?", + "Bengali": "আমাকে কি ট্রেনগুলি পরিবর্তন করতে হবে?", + "Russian": "Нужно ли делать пересадку?", + "Japanese": "乗り換えなきゃいけませんか?", + "Punjabi": "ਕੀ ਮੈਨੂੰ ਰੇਲ ਗੱਡੀ ਬਦਲਨੀ ਪਵੇਗੀ?", + "Javanese": "Apa aku kudu ngganti sepur?", + "Korean": "환승해야 하나요?", + "French": "Dois-je changer de train?", + "German": "Muss ich die Züge wechseln?" + }, + { + "English": "How do I get to the train station?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我怎么去火车站?", + "Arabic": "كيف يمكنني الوصول إلى محطة القطار؟", + "Portuguese": "Como chego à estação de trem?", + "Bengali": "আমি কিভাবে ট্রেন স্টেশনে যেতে পারি?", + "Russian": "Как мне добраться до железнодорожного вокзала?", + "Japanese": "列車駅にはどうやって行きますか?", + "Punjabi": "ਮੈਂ ਰੇਲ ਗੱਡੀ ਦੇ ਸਟੇਸ਼ਨ ਤੇ ਕਿਵੇਂ ਪਹੁੰਚਾਂਗਾ?", + "Javanese": "Piye carane aku tekan stasiun sepur?", + "Korean": "기차역까지 어떻게 가나요?", + "French": "Comment arrive-je à la gare?", + "German": "Wie komme ich zum Bahnhof?" + }, + { + "English": "Can you call a taxi for me?", + "sceneType": "Transportation", + "Chinese (Simplified)": "你能帮我叫辆出租车吗?", + "Spanish": "¿Puedes llamarme un taxi?", + "Hindi": "क्या आप मेरे लिए टैक्सी बुला सकते हैं?", + "Arabic": "هل يمكنك استدعاء سيارة أجرة بالنسبة لي؟", + "Portuguese": "Você pode chamar um táxi para mim?", + "Bengali": "আপনি আমার জন্য একটি ট্যাক্সি কল করতে পারেন?", + "Russian": "Ты можешь вызвать мне такси?", + "Japanese": "タクシーを呼んでもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੇਰੇ ਲਈ ਟੈਕਸੀ ਬੁਲਾ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa nelpon taksi kanggo aku?", + "Korean": "택시 좀 불러 주실 수 있나요?", + "French": "Pouvez-vous m'appeler un taxi ?", + "German": "Können Sie mir ein Taxi rufen?" + }, + { + "English": "What platform does the train leave from?", + "sceneType": "Transportation", + "Chinese (Simplified)": "火车从哪个站台出发?", + "Spanish": "¿Desde qué andén sale el tren?", + "Hindi": "ट्रेन किस प्लेटफार्म से प्रस्थान करती है?", + "Arabic": "من أي رصيف ينطلق القطار؟", + "Bengali": "ট্রেন কোন প্লাটফর্ম থেকে ছাড়ে?", + "Russian": "С какой платформы отправляется поезд?", + "Japanese": "電車はどのプラットホームから出発しますか?", + "Punjabi": "ਟ੍ਰੇਨ ਕਿਸ ਪਲੇਟਫਾਰਮ ਤੋਂ ਰਵਾਨਾ ਹੁੰਦੀ ਹੈ?", + "Javanese": "Sepur mangkat saka platform endi?", + "Korean": "기차는 어느 플랫폼에서 출발하나요?", + "French": "De quel quai part le train ?", + "German": "Von welchem ​​Bahnsteig fährt der Zug ab?" + }, + { + "English": "Can I get a refund for my ticket?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我可以退票吗?", + "Spanish": "¿Puedo reembolsar mi billete?", + "Hindi": "क्या मैं अपना टिकट वापस कर सकता हूँ?", + "Arabic": "هل يمكنني استرداد تذكرتي؟", + "Portuguese": "Posso reembolsar meu ingresso?", + "Bengali": "আমি কি আমার টিকিট ফেরত দিতে পারি?", + "Russian": "Могу ли я вернуть билет?", + "Japanese": "チケットを払い戻すことはできますか?", + "Punjabi": "ਕੀ ਮੈਂ ਆਪਣੀ ਟਿਕਟ ਵਾਪਸ ਕਰ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa mbalekake tiketku?", + "Korean": "티켓을 환불할 수 있나요?", + "French": "Puis-je rembourser mon billet ?", + "German": "Kann ich mein Ticket erstatten?" + }, + { + "English": "Is there a direct bus to the airport?", + "sceneType": "Transportation", + "Chinese (Simplified)": "有直达机场的公交车吗?", + "Spanish": "¿Hay autobús directo al aeropuerto?", + "Hindi": "क्या हवाई अड्डे के लिए कोई सीधी बस है?", + "Arabic": "هل هناك حافلة مباشرة إلى المطار؟", + "Portuguese": "Existe um ônibus direto para o aeroporto?", + "Bengali": "বিমানবন্দরে সরাসরি বাস আছে কি?", + "Russian": "Есть ли прямой автобус до аэропорта?", + "Japanese": "空港への直通バスはありますか?", + "Punjabi": "ਕੀ ਹਵਾਈ ਅੱਡੇ ਲਈ ਸਿੱਧੀ ਬੱਸ ਹੈ?", + "Javanese": "Apa ana bis langsung menyang bandara?", + "Korean": "공항까지 직행버스가 있나요?", + "French": "Y a-t-il un bus direct pour l'aéroport ?", + "German": "Gibt es einen direkten Bus zum Flughafen?" + }, + { + "English": "What time does the last train leave?", + "sceneType": "Transportation", + "Chinese (Simplified)": "最后一班火车几点开?", + "Spanish": "¿A qué hora sale el último tren?", + "Hindi": "आखिरी ट्रेन कितने बजे छूटती है?", + "Arabic": "في أي وقت يغادر القطار الأخير؟", + "Portuguese": "A que horas sai o último trem?", + "Bengali": "শেষ ট্রেন কখন ছাড়ে?", + "Russian": "Во сколько уходит последний поезд?", + "Japanese": "最終電車は何時に出発しますか?", + "Punjabi": "ਆਖਰੀ ਰੇਲਗੱਡੀ ਕਿੰਨੇ ਵਜੇ ਰਵਾਨਾ ਹੁੰਦੀ ਹੈ?", + "Javanese": "Jam pira sepur pungkasan mangkat?", + "Korean": "마지막 열차는 몇시에 출발하나요?", + "French": "À quelle heure part le dernier train ?", + "German": "Wann fährt der letzte Zug ab?" + }, + { + "English": "Where is the nearest gas station?", + "sceneType": "Transportation", + "Chinese (Simplified)": "最近的加油站在哪里?", + "Spanish": "¿Dónde está la gasolinera más cercana?", + "Hindi": "निकटतम गैस स्टेशन कहां पर है?", + "Arabic": "أين أقرب محطة وقود؟", + "Portuguese": "Onde está o posto de gasolina mais próximo?", + "Bengali": "নিকটতম গ্যাস স্টেশন কোথায়?", + "Russian": "Где находится ближайшая заправка?", + "Japanese": "最寄のガソリンスタンドはどこですか?", + "Punjabi": "ਸਭਤੋਂ ਨੇੜੇ ਦਾ ਪਟਰੋਲ ਸਟੇਸ਼ਨ ਕਿੱਥੇ ਹੈ?", + "Javanese": "Endi pom bensin sing paling cedhak?", + "Korean": "가장 가까운 주유소는 어디에 있나요?", + "French": "Où est la station d'essence la plus proche?", + "German": "Wo ist die nächste Tankstelle?" + }, + { + "English": "How do I get to the hotel?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我怎么去酒店?", + "Spanish": "¿Como llego al hotel?", + "Hindi": "मैं होटल कैसे पहूंच सकता हूं?", + "Arabic": "كيف أصل إلى الفندق؟", + "Portuguese": "Como faço para chegar ao hotel?", + "Bengali": "আমি কিভাবে হোটেল পেতে পারি?", + "Japanese": "ホテルまではどうやって行けばいいですか?", + "Punjabi": "ਮੈਂ ਹੋਟਲ ਕਿਵੇਂ ਪਹੁੰਚਾਂ?", + "Javanese": "Carane aku njaluk menyang hotel?", + "Korean": "호텔까지 어떻게 가나요?", + "French": "Comment je me rends à l'hôtel?", + "German": "Wie komme ich zum Hotel?" + }, + { + "English": "Can I buy a monthly pass?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我可以买月票吗?", + "Spanish": "¿Puedo comprar un pase mensual?", + "Hindi": "क्या मैं एक मासिक पास खरीद सकता हूं?", + "Arabic": "هل يمكنني شراء بطاقة شهرية؟", + "Portuguese": "Posso comprar um passe mensal?", + "Bengali": "আমি কি মাসিক পাস কিনতে পারি?", + "Russian": "Можно ли купить месячный абонемент?", + "Japanese": "月間定期券を購入することはできますか?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਕ ਮਾਸਿਕ ਪਾਸ ਖਰੀਦ ਸੱਕਦਾ ਹਾਂ?", + "Javanese": "Bisa tuku pass saben wulan?", + "Korean": "월간 이용권을 구입할 수 있나요?", + "French": "Puis-je acheter un abonnement mensuel?", + "German": "Kann ich eine Monatskarte kaufen?" + }, + { + "English": "Is this seat taken?", + "sceneType": "Transportation", + "Chinese (Simplified)": "这个座位有人吗?", + "Spanish": "¿Está libre este asiento?", + "Hindi": "क्या यह सीट दे दी गई है?", + "Arabic": "هل تم شغل هذا المقعد؟", + "Portuguese": "Este assento está ocupado?", + "Bengali": "এই সীটে কি কেউ বসেছেন?", + "Russian": "Здесь свободно?", + "Japanese": "この席は空いていますか?", + "Punjabi": "ਕੀ ਇਸ ਸੀਟ ਤੇ ਕੋਈ ਬੈਠਾ ਹੋਇਆ ਹੈ?", + "Javanese": "Apa kursi iki dijupuk?", + "Korean": "자리 있나요?", + "French": "Ce siège est-il occupé ?", + "German": "Ist dieser Platz belegt?" + }, + { + "English": "What is the fare to the airport?", + "sceneType": "Transportation", + "Chinese (Simplified)": "到机场的车费是多少?", + "Spanish": "¿Cuánto cuesta la tarifa al aeropuerto?", + "Hindi": "एयरपोर्ट का किराया कितना है?", + "Arabic": "كم هي الأجرة إلى المطار؟", + "Portuguese": "Quanto é a passagem para o aeroporto?", + "Bengali": "এয়ারপোর্টে যাওয়ার ভাড়া কত?", + "Russian": "Сколько стоит проезд до аэропорта?", + "Japanese": "空港までの運賃はいくらですか?", + "Punjabi": "ਹਵਾਈ ਅੱਡੇ ਦਾ ਕਿਰਾਇਆ ਕਿੰਨਾ ਹੈ?", + "Javanese": "Pira regane menyang bandara?", + "Korean": "공항까지 요금은 얼마인가요?", + "French": "Combien coûte le tarif pour l'aéroport ?", + "German": "Wie hoch ist der Fahrpreis zum Flughafen?" + }, + { + "English": "How do I validate my ticket?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我怎么验证车票?", + "Spanish": "¿Cómo verifico mi boleto?", + "Hindi": "मैं अपना टिकट कैसे सत्यापित करूं?", + "Arabic": "كيف يمكنني التحقق من تذكرتي؟", + "Portuguese": "Como posso verificar meu ingresso?", + "Bengali": "আমি কিভাবে আমার টিকিট যাচাই করব?", + "Russian": "Как мне проверить свой билет?", + "Japanese": "チケットを確認するにはどうすればよいですか?", + "Punjabi": "ਮੈਂ ਆਪਣੀ ਟਿਕਟ ਦੀ ਪੁਸ਼ਟੀ ਕਿਵੇਂ ਕਰਾਂ?", + "Javanese": "Kepiye carane verifikasi tiketku?", + "Korean": "티켓을 어떻게 확인하나요?", + "French": "Comment puis-je vérifier mon billet ?", + "German": "Wie verifiziere ich mein Ticket?" + }, + { + "English": "Where do I catch the shuttle bus?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我在哪里坐穿梭巴士?", + "Spanish": "¿Dónde tomo el autobús lanzadera?", + "Hindi": "मैं शटल बस कहाँ से पकड़ूँ?", + "Arabic": "أين يمكنني اللحاق بالحافلة المكوكية؟", + "Portuguese": "Onde pego o ônibus?", + "Bengali": "আমি শাটল বাস কোথায় ধরব?", + "Russian": "Где мне сесть на маршрутный автобус?", + "Japanese": "シャトルバスはどこで乗れますか?", + "Punjabi": "ਮੈਂ ਸ਼ਟਲ ਬੱਸ ਕਿੱਥੇ ਫੜਾਂ?", + "Javanese": "Ngendi aku numpak bis antar-jemput?", + "Korean": "셔틀버스는 어디서 타나요?", + "French": "Où puis-je prendre la navette ?", + "German": "Wo nehme ich den Shuttlebus?" + }, + { + "English": "Can I have a timetable?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我可以要个时间表吗?", + "Spanish": "¿Puedo pedir un horario?", + "Hindi": "क्या मैं समय सारिणी मांग सकता हूँ?", + "Arabic": "هل يمكنني أن أسأل عن جدول زمني؟", + "Portuguese": "Posso pedir um horário?", + "Bengali": "আমি একটি সময়সূচী জন্য জিজ্ঞাসা করতে পারেন?", + "Russian": "Могу ли я попросить расписание?", + "Japanese": "時刻表を聞いてもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਸਮਾਂ-ਸਾਰਣੀ ਲਈ ਪੁੱਛ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa njaluk jadwal?", + "Korean": "시간표를 물어봐도 될까요?", + "French": "Puis-je demander un horaire ?", + "German": "Kann ich einen Fahrplan anfordern?" + }, + { + "English": "What time does the first train leave?", + "sceneType": "Transportation", + "Chinese (Simplified)": "第一班火车几点开?", + "Spanish": "¿A qué hora sale el primer tren?", + "Hindi": "पहली ट्रेन कितने बजे छूटती है?", + "Arabic": "في أي وقت يغادر القطار الأول؟", + "Portuguese": "A que horas sai o primeiro trem?", + "Bengali": "প্রথম ট্রেন কখন ছাড়ে?", + "Russian": "Во сколько отправляется первый поезд?", + "Japanese": "始発電車は何時に出発しますか?", + "Punjabi": "ਪਹਿਲੀ ਰੇਲਗੱਡੀ ਕਿੰਨੇ ਵਜੇ ਰਵਾਨਾ ਹੁੰਦੀ ਹੈ?", + "Javanese": "Sepur pisanan mangkat jam pinten?", + "Korean": "첫차는 몇시에 출발하나요?", + "French": "À quelle heure part le premier train ?", + "German": "Wann fährt der erste Zug ab?" + }, + { + "English": "How far is it to the city center?", + "sceneType": "Transportation", + "Chinese (Simplified)": "到市中心有多远?", + "Spanish": "¿Qué tan lejos está del centro de la ciudad?", + "Hindi": "यह शहर के केंद्र से कितनी दूर है?", + "Arabic": "كم يبعد عن وسط المدينة؟", + "Portuguese": "Qual a distância até o centro da cidade?", + "Bengali": "শহরের কেন্দ্র থেকে এটি কত দূরে?", + "Russian": "Как далеко до центра города?", + "Japanese": "市内中心部までどのくらいの距離ですか?", + "Punjabi": "ਇਹ ਸ਼ਹਿਰ ਦੇ ਕੇਂਦਰ ਤੋਂ ਕਿੰਨੀ ਦੂਰ ਹੈ?", + "Javanese": "Carane adoh saka pusat kutha?", + "Korean": "시내 중심까지 얼마나 멉니까?", + "French": "Jusqu'où est le centre-ville ?", + "German": "Wie weit ist es bis zum Stadtzentrum?" + }, + { + "English": "Is there a night bus?", + "sceneType": "Transportation", + "Chinese (Simplified)": "有夜班车吗?", + "Spanish": "¿Hay un autobús nocturno?", + "Hindi": "क्या कोई रात्रि बस है?", + "Arabic": "هل هناك حافلة ليلية؟", + "Portuguese": "Existe ônibus noturno?", + "Bengali": "রাতের বাস আছে?", + "Russian": "Есть ли ночной автобус?", + "Japanese": "夜行バスはありますか?", + "Punjabi": "ਕੀ ਰਾਤ ਦੀ ਬੱਸ ਹੈ?", + "Javanese": "Apa ana bis wengi?", + "Korean": "야간버스가 있나요?", + "French": "Y a-t-il un bus de nuit ?", + "German": "Gibt es einen Nachtbus?" + }, + { + "English": "How do I get to the bus terminal?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我怎么去公交车总站?", + "Spanish": "¿Cómo llego a la terminal de autobuses?", + "Hindi": "मैं बस टर्मिनल तक कैसे पहुँचूँ?", + "Arabic": "كيف أصل إلى محطة الحافلات؟", + "Portuguese": "Como chego ao terminal de ônibus?", + "Bengali": "আমি কিভাবে বাস টার্মিনালে যেতে পারি?", + "Russian": "Как мне добраться до автовокзала?", + "Japanese": "バスターミナルにはどうやって行けばいいですか?", + "Punjabi": "ਮੈਂ ਬੱਸ ਟਰਮੀਨਲ ਤੱਕ ਕਿਵੇਂ ਪਹੁੰਚਾਂ?", + "Javanese": "Kepiye carane aku tekan terminal bis?", + "Korean": "버스터미널까지 어떻게 가나요?", + "French": "Comment puis-je me rendre à la gare routière ?", + "German": "Wie komme ich zum Busbahnhof?" + }, + { + "English": "Where is the exit?", + "sceneType": "Transportation", + "Chinese (Simplified)": "出口在哪里?", + "Spanish": "¿Dónde está la salida?", + "Hindi": "निकास द्वार कहाँ है?", + "Arabic": "اين المخرج؟", + "Portuguese": "Onde é a saída?", + "Bengali": "বেরোবার পথ কোনটা?", + "Russian": "Где выход?", + "Japanese": "出口はどこですか?", + "Punjabi": "ਨਿਕਾਸ ਕਿੱਥੇ ਹੈ?", + "Javanese": "metu ngendi?", + "Korean": "출구는 어디입니까?", + "French": "Où est la sortie ?", + "German": "Wo ist der Ausgang?" + }, + { + "English": "Can I get a student discount?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我可以有学生折扣吗?", + "Spanish": "¿Puedo tener un descuento para estudiantes?", + "Hindi": "क्या मुझे छात्र छूट मिल सकती है?", + "Arabic": "هل يمكنني الحصول على خصم للطلاب؟", + "Portuguese": "Posso ter desconto para estudantes?", + "Bengali": "আমি কি ছাত্র ছাড় পেতে পারি?", + "Russian": "Могу ли я получить студенческую скидку?", + "Japanese": "学生割引は利用できますか?", + "Punjabi": "ਕੀ ਮੈਨੂੰ ਵਿਦਿਆਰਥੀ ਛੋਟ ਮਿਲ ਸਕਦੀ ਹੈ?", + "Javanese": "Apa aku bisa njaluk diskon siswa?", + "Korean": "학생 할인이 가능한가요?", + "French": "Puis-je bénéficier d’une réduction étudiante ?", + "German": "Kann ich einen Studentenrabatt erhalten?" + }, + { + "English": "How do I get to the other side of town?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我怎么去城的另一边?", + "Spanish": "¿Cómo llego al otro lado de la ciudad?", + "Hindi": "मैं शहर के दूसरी ओर कैसे पहुँचूँ?", + "Arabic": "كيف أصل إلى الجانب الآخر من المدينة؟", + "Portuguese": "Como faço para chegar ao outro lado da cidade?", + "Bengali": "আমি শহরের অন্য প্রান্তে কিভাবে পেতে পারি?", + "Russian": "Как мне добраться до другого конца города?", + "Japanese": "どうすれば町の反対側に行くことができますか?", + "Punjabi": "ਮੈਂ ਸ਼ਹਿਰ ਦੇ ਦੂਜੇ ਪਾਸੇ ਕਿਵੇਂ ਜਾਵਾਂ?", + "Javanese": "Kepiye carane aku menyang sisih liya kutha?", + "Korean": "마을 반대편으로 어떻게 가나요?", + "French": "Comment puis-je me rendre à l’autre bout de la ville ?", + "German": "Wie komme ich auf die andere Seite der Stadt?" + }, + { + "English": "What time does the ferry leave?", + "sceneType": "Transportation", + "Chinese (Simplified)": "渡轮几点出发?", + "Spanish": "¿A qué hora sale el ferry?", + "Hindi": "नौका कितने बजे निकलती है?", + "Arabic": "في أي وقت تغادر العبارة؟", + "Portuguese": "A que horas sai a balsa?", + "Bengali": "ফেরি কখন ছাড়ে?", + "Russian": "Во сколько отправляется паром?", + "Japanese": "フェリーは何時に出発しますか?", + "Punjabi": "ਕਿਸ਼ਤੀ ਕਿੰਨੇ ਵਜੇ ਰਵਾਨਾ ਹੁੰਦੀ ਹੈ?", + "Javanese": "Jam pira budhal feri?", + "Korean": "페리는 몇시에 출발하나요?", + "French": "À quelle heure part le ferry ?", + "German": "Wann fährt die Fähre ab?" + }, + { + "English": "Is this the train to New York?", + "sceneType": "Transportation", + "Chinese (Simplified)": "这是去纽约的火车吗?", + "Spanish": "¿Es este un tren a Nueva York?", + "Hindi": "क्या यह न्यूयॉर्क के लिए ट्रेन है?", + "Arabic": "هل هذا قطار إلى نيويورك؟", + "Portuguese": "Isto é um trem para Nova York?", + "Bengali": "এটা কি নিউ ইয়র্ক যাওয়ার ট্রেন?", + "Russian": "Это поезд в Нью-Йорк?", + "Japanese": "これはニューヨーク行きの電車ですか?", + "Punjabi": "ਕੀ ਇਹ ਨਿਊਯਾਰਕ ਜਾਣ ਵਾਲੀ ਰੇਲਗੱਡੀ ਹੈ?", + "Javanese": "Apa iki sepur menyang New York?", + "Korean": "이거 뉴욕행 기차인가요?", + "French": "Est-ce un train pour New York ?", + "German": "Ist das ein Zug nach New York?" + }, + { + "English": "Where can I find a taxi?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我在哪里可以找到出租车?", + "Hindi": "मुझे टैक्सी कहाँ मिल सकती है?", + "Arabic": "أين يمكنني أن أجد سيارة أجرة؟", + "Portuguese": "Onde posso encontrar um táxi?", + "Bengali": "আমি কোথা থেকে একটা ট্যাক্সি পেতে পারি?", + "Russian": "Где я могу найти такси?", + "Japanese": "タクシーはどこで見つけられますか?", + "Punjabi": "ਮੈਨੂੰ ਟੈਕਸੀ ਕਿੱਥੇ ਮਿਲ ਸਕਦੀ ਹੈ?", + "Javanese": "Ing endi aku bisa nemokake taksi?", + "Korean": "택시는 어디서 찾을 수 있나요?", + "French": "Où puis-je trouver un taxi?", + "German": "Wo kann ich ein Taxi finden?" + }, + { + "English": "Can I pay the fare with a credit card?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我可以用信用卡支付车费吗?", + "Spanish": "¿Puedo pagar mi tarifa con tarjeta de crédito?", + "Hindi": "क्या मैं अपना किराया क्रेडिट कार्ड से चुका सकता हूँ?", + "Arabic": "هل يمكنني دفع الأجرة باستخدام بطاقة الائتمان؟", + "Portuguese": "Posso pagar minha passagem com cartão de crédito?", + "Bengali": "আমি কি ক্রেডিট কার্ড দিয়ে আমার ভাড়া পরিশোধ করতে পারি?", + "Russian": "Могу ли я оплатить проезд кредитной картой?", + "Japanese": "クレジットカードで運賃を支払うことはできますか?", + "Punjabi": "ਕੀ ਮੈਂ ਆਪਣਾ ਕਿਰਾਇਆ ਕ੍ਰੈਡਿਟ ਕਾਰਡ ਨਾਲ ਅਦਾ ਕਰ ਸਕਦਾ\/ਦੀ ਹਾਂ?", + "Javanese": "Apa aku bisa mbayar beya nganggo kertu kredit?", + "Korean": "신용카드로 요금을 결제할 수 있나요?", + "French": "Puis-je payer mon billet avec une carte de crédit ?", + "German": "Kann ich meinen Fahrpreis mit Kreditkarte bezahlen?" + }, + { + "English": "What is the quickest way to get there?", + "sceneType": "Transportation", + "Chinese (Simplified)": "去那里的最快方式是什么?", + "Spanish": "¿Cuál es la forma más rápida de llegar?", + "Hindi": "वहां पहुंचने का सबसे तेज़ तरीका क्या है?", + "Arabic": "ما هي أسرع طريقة للوصول إلى هناك؟", + "Portuguese": "Qual é a maneira mais rápida de chegar lá?", + "Bengali": "সেখানে যাওয়ার দ্রুততম উপায় কী?", + "Russian": "Какой самый быстрый способ добраться туда?", + "Japanese": "そこに行くのに一番早い方法は何ですか?", + "Punjabi": "ਉੱਥੇ ਪਹੁੰਚਣ ਦਾ ਸਭ ਤੋਂ ਤੇਜ਼ ਤਰੀਕਾ ਕੀ ਹੈ?", + "Javanese": "Apa cara paling cepet kanggo tekan kono?", + "Korean": "거기까지 가는 가장 빠른 방법은 무엇입니까?", + "French": "Quel est le moyen le plus rapide pour y arriver ?", + "German": "Wie komme ich am schnellsten dorthin?" + }, + { + "English": "Can I get a day pass?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我可以买一日票吗?", + "Spanish": "¿Puedo comprar un billete de un día?", + "Hindi": "क्या मैं एक दिन का टिकट खरीद सकता हूँ?", + "Arabic": "هل يمكنني شراء تذكرة يومية؟", + "Portuguese": "Posso comprar um ingresso diário?", + "Bengali": "আমি কি একদিনের টিকিট কিনতে পারি?", + "Russian": "Могу ли я купить дневной билет?", + "Japanese": "当日券は買えますか?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਕ ਦਿਨ ਦੀ ਟਿਕਟ ਖਰੀਦ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Bisa tuku tiket dina?", + "Korean": "당일권을 구입할 수 있나요?", + "French": "Puis-je acheter un ticket journalier ?", + "German": "Kann ich eine Tageskarte kaufen?" + }, + { + "English": "Where do I buy a bus ticket?", + "sceneType": "Transportation", + "Chinese (Simplified)": "我在哪里买公交车票?", + "Spanish": "¿Dónde compro billetes de autobús?", + "Hindi": "मैं बस टिकट कहां से खरीदूं?", + "Arabic": "أين يمكنني شراء تذاكر الحافلة؟", + "Portuguese": "Onde compro passagens de ônibus?", + "Bengali": "বাসের টিকিট কোথায় কিনব?", + "Russian": "Где купить билеты на автобус?", + "Japanese": "バスのチケットはどこで買えますか?", + "Punjabi": "ਮੈਂ ਬੱਸ ਦੀਆਂ ਟਿਕਟਾਂ ਕਿੱਥੋਂ ਖਰੀਦਾਂ?", + "Javanese": "Ngendi aku tuku tiket bis?", + "Korean": "버스표는 어디서 구매하나요?", + "French": "Où puis-je acheter des billets de bus ?", + "German": "Wo kaufe ich Bustickets?" + } + ] + }, + { + "sceneSource": "Family", + "sceneType": "Family", + "sceneList": [ + { + "English": "This is my mother", + "sceneType": "Family", + "Chinese (Simplified)": "这是我妈妈", + "Spanish": "esta es mi madre", + "Hindi": "आ माता म्हांरी है", + "Arabic": "هذه امي", + "Portuguese": "essa é minha mãe", + "Bengali": "ইনি আমার মা", + "Russian": "это моя мама", + "Japanese": "私の母です", + "Punjabi": "ਇਹ ਮੇਰੀ ਮਾਂ ਹੈ", + "Javanese": "iki ibuku", + "Korean": "우리 엄마야", + "French": "c'est ma mère", + "German": "Das ist meine Mutter" + }, + { + "English": "I have a brother", + "sceneType": "Family", + "Chinese (Simplified)": "我有一个哥哥", + "Spanish": "tengo un hermano", + "Hindi": "मेरा एक भाई है", + "Arabic": "انا لدي اخ", + "Portuguese": "eu tenho um irmão", + "Bengali": "আমার একটি ভাই আছে", + "Russian": "у меня есть брат", + "Japanese": "弟がいます", + "Punjabi": "ਮੇਰਾ ਇਕ ਭਰਾ ਹੈ", + "Javanese": "aku duwe sedulur", + "Korean": "나에겐 형제가 있어요", + "French": "j'ai un frère", + "German": "Ich habe einen Bruder" + }, + { + "English": "We live together", + "sceneType": "Family", + "Chinese (Simplified)": "我们住在一起", + "Spanish": "vivimos juntos", + "Hindi": "हम एक साथ रहते हैं", + "Arabic": "نعيش معا", + "Portuguese": "nós vivemos juntos", + "Bengali": "আমরা একসাথে থাকি", + "Russian": "мы живем вместе", + "Japanese": "私たちは一緒に住んでいます", + "Punjabi": "ਅਸੀਂ ਇਕੱਠੇ ਰਹਿੰਦੇ ਹਾਂ", + "Javanese": "kita manggon bebarengan", + "Korean": "우리는 같이 산다", + "French": "nous vivons ensemble", + "German": "wir leben zusammen" + }, + { + "English": "Family is important", + "sceneType": "Family", + "Chinese (Simplified)": "家庭很重要", + "Spanish": "La familia es importante", + "Hindi": "परिवार महत्वपूर्ण है", + "Arabic": "العائلة مهمة", + "Portuguese": "família é importante", + "Bengali": "পরিবার গুরুত্বপূর্ণ", + "Russian": "семья важна", + "Japanese": "家族は大切です", + "Punjabi": "ਪਰਿਵਾਰ ਮਹੱਤਵਪੂਰਨ ਹੈ", + "Javanese": "kulawarga iku penting", + "Korean": "가족은 중요하다", + "French": "la famille est importante", + "German": "Familie ist wichtig" + }, + { + "English": "Do you have children?", + "sceneType": "Family", + "Chinese (Simplified)": "你有孩子吗?", + "Spanish": "¿Tienes un niño?", + "Hindi": "क्या आपके कोई बच्चा है?", + "Arabic": "هل لديك طفل؟", + "Portuguese": "Você tem uma criança?", + "Bengali": "তোমার কি বাচ্চা আছে?", + "Russian": "У вас есть ребенок?", + "Japanese": "子供はいますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡਾ ਕੋਈ ਬੱਚਾ ਹੈ?", + "Javanese": "Apa sampeyan duwe anak?", + "Korean": "아이가 있나요?", + "French": "Avez-vous un enfant?", + "German": "Hast du ein Kind?" + }, + { + "English": "I love my family", + "sceneType": "Family", + "Chinese (Simplified)": "我爱我的家人", + "Spanish": "amo a mi familia", + "Hindi": "मुझे अपने परिवार से प्यार है", + "Arabic": "أنا أحب عائلتي", + "Portuguese": "eu amo minha família", + "Bengali": "আমি আমার পরিবারকে ভালবাসি", + "Russian": "я люблю свою семью", + "Japanese": "私は家族を愛しています", + "Punjabi": "ਮੈਂ ਆਪਣੇ ਪਰਿਵਾਰ ਨੂੰ ਪਿਆਰ ਕਰਦਾ ਹਾਂ", + "Javanese": "aku tresna marang kulawargaku", + "Korean": "나는 내 가족을 사랑한다", + "French": "J'adore ma famille", + "German": "Ich liebe meine Familie" + }, + { + "English": "My father is a doctor", + "sceneType": "Family", + "Chinese (Simplified)": "我爸爸是医生", + "Spanish": "mi papa es medico", + "Hindi": "मेरे पिताजी एक डॉक्टर हैं", + "Arabic": "والدي طبيب", + "Portuguese": "Meu pai é médico", + "Bengali": "আমার বাবা একজন ডাক্তার", + "Russian": "Мой папа врач", + "Japanese": "私の父は医者です", + "Punjabi": "ਮੇਰੇ ਡੈਡੀ ਡਾਕਟਰ ਹਨ", + "Javanese": "Bapakku dokter", + "Korean": "우리 아빠는 의사예요", + "French": "Mon père est médecin", + "German": "Mein Vater ist Arzt" + }, + { + "English": "We have dinner together every night", + "sceneType": "Family", + "Chinese (Simplified)": "我们每晚一起吃晚餐", + "Spanish": "cenamos juntos todas las noches", + "Hindi": "हम हर रात एक साथ खाना खाते हैं", + "Arabic": "نتناول العشاء معًا كل ليلة", + "Portuguese": "jantamos juntos todas as noites", + "Bengali": "আমরা প্রতি রাতে একসাথে ডিনার করি", + "Russian": "мы ужинаем вместе каждый вечер", + "Japanese": "私たちは毎晩一緒に夕食を食べます", + "Punjabi": "ਅਸੀਂ ਹਰ ਰਾਤ ਇਕੱਠੇ ਡਿਨਰ ਕਰਦੇ ਹਾਂ", + "Javanese": "kita nedha bengi bebarengan saben wengi", + "Korean": "우리는 매일 밤 함께 저녁을 먹어요", + "French": "nous dînons ensemble tous les soirs", + "German": "Wir essen jeden Abend zusammen zu Abend" + }, + { + "English": "My sister is in high school", + "sceneType": "Family", + "Chinese (Simplified)": "我妹妹在上高中", + "Spanish": "mi hermana esta en la secundaria", + "Hindi": "मेरी बहन हाई स्कूल में है", + "Arabic": "أختي في المدرسة الثانوية", + "Portuguese": "Minha irmã está no ensino médio", + "Bengali": "আমার বোন হাই স্কুলে পড়ে", + "Russian": "Моя сестра учится в старшей школе", + "Japanese": "私の妹は高校生です", + "Punjabi": "ਮੇਰੀ ਭੈਣ ਹਾਈ ਸਕੂਲ ਵਿੱਚ ਹੈ", + "Javanese": "Adhiku wis SMA", + "Korean": "내 여동생은 고등학생이야", + "French": "Ma sœur est au lycée", + "German": "Meine Schwester ist in der High School" + }, + { + "English": "This is our home", + "sceneType": "Family", + "Chinese (Simplified)": "这是我们的家", + "Spanish": "esta es nuestra casa", + "Hindi": "यह हमारा घर है", + "Arabic": "هذا منزلنا", + "Portuguese": "Esta é a nossa casa", + "Bengali": "এটা আমাদের বাড়ি", + "Russian": "это наш дом", + "Japanese": "ここが私たちの家です", + "Punjabi": "ਇਹ ਸਾਡਾ ਘਰ ਹੈ", + "Javanese": "iki omah kita", + "Korean": "여기가 우리 집이야", + "French": "C'est notre maison", + "German": "das ist unser Zuhause" + }, + { + "English": "We like to travel together", + "sceneType": "Family", + "Chinese (Simplified)": "我们喜欢一起旅行", + "Spanish": "nos gusta viajar juntos", + "Hindi": "हमें एक साथ यात्रा करना पसंद है", + "Arabic": "نحب السفر معًا", + "Portuguese": "gostamos de viajar juntos", + "Bengali": "আমরা একসাথে ভ্রমণ করতে পছন্দ করি", + "Russian": "нам нравится путешествовать вместе", + "Japanese": "私たちは一緒に旅行するのが好きです", + "Punjabi": "ਅਸੀਂ ਇਕੱਠੇ ਸਫ਼ਰ ਕਰਨਾ ਪਸੰਦ ਕਰਦੇ ਹਾਂ", + "Javanese": "kita seneng lelungan bebarengan", + "Korean": "우리는 함께 여행하는 걸 좋아해요", + "French": "nous aimons voyager ensemble", + "German": "Wir reisen gerne zusammen" + }, + { + "English": "My grandparents live with us", + "sceneType": "Family", + "Chinese (Simplified)": "我的祖父母和我们住在一起", + "Spanish": "mis abuelos viven con nosotros", + "Hindi": "मेरे दादा-दादी हमारे साथ रहते हैं", + "Arabic": "أجدادي يعيشون معنا", + "Portuguese": "meus avós moram conosco", + "Bengali": "আমার দাদা-দাদি আমাদের সাথে থাকেন", + "Russian": "мои бабушка и дедушка живут с нами", + "Japanese": "私の祖父母は私たちと一緒に住んでいます", + "Punjabi": "ਮੇਰੇ ਦਾਦਾ-ਦਾਦੀ ਸਾਡੇ ਨਾਲ ਰਹਿੰਦੇ ਹਨ", + "Korean": "우리 조부모님은 우리와 함께 살아요", + "French": "mes grands-parents vivent avec nous", + "German": "meine Großeltern wohnen bei uns" + }, + { + "English": "I have two siblings", + "sceneType": "Family", + "Chinese (Simplified)": "我有两个兄弟姐妹", + "Spanish": "tengo dos hermanos y hermanas", + "Hindi": "मेरे दो भाई-बहन हैं", + "Arabic": "لدي شقيقان وأختان", + "Portuguese": "eu tenho dois irmãos e irmãs", + "Bengali": "আমার দুই ভাই ও বোন আছে", + "Russian": "у меня есть два брата и сестры", + "Japanese": "私には2人の兄弟と姉妹がいます", + "Punjabi": "ਮੇਰੇ ਦੋ ਭਰਾ ਅਤੇ ਭੈਣ ਹਨ", + "Javanese": "Aku duwe sedulur loro", + "Korean": "나에겐 남동생이 두 명 있어요", + "French": "j'ai deux frères et sœurs", + "German": "Ich habe zwei Brüder und Schwestern" + }, + { + "English": "We celebrate holidays together", + "sceneType": "Family", + "Chinese (Simplified)": "我们一起庆祝节日", + "Spanish": "Celebremos las fiestas juntos", + "Hindi": "आइए साथ मिलकर छुट्टियाँ मनाएँ", + "Arabic": "دعونا نحتفل بالعطلات معا", + "Portuguese": "Vamos comemorar os feriados juntos", + "Bengali": "আসুন একসাথে ছুটি উদযাপন করি", + "Russian": "Давайте отмечать праздники вместе", + "Japanese": "一緒に休日を祝いましょう", + "Punjabi": "ਆਓ ਮਿਲ ਕੇ ਛੁੱਟੀਆਂ ਮਨਾਈਏ", + "Javanese": "Ayo padha ngrayakake preian bebarengan", + "Korean": "명절을 함께 축하하자", + "French": "Célébrons les vacances ensemble", + "German": "Lasst uns gemeinsam die Feiertage feiern" + }, + { + "English": "My mother cooks delicious food", + "sceneType": "Family", + "Chinese (Simplified)": "我妈妈做的饭很好吃", + "Spanish": "La comida de mi madre es deliciosa.", + "Hindi": "मेरी माँ का खाना बहुत स्वादिष्ट है", + "Arabic": "طبخ والدتي لذيذ", + "Portuguese": "A comida da minha mãe é deliciosa", + "Bengali": "আমার মায়ের রান্না সুস্বাদু", + "Russian": "Моя мама очень вкусно готовит", + "Japanese": "母の料理はおいしいです", + "Punjabi": "ਮੇਰੀ ਮਾਂ ਦਾ ਖਾਣਾ ਸੁਆਦੀ ਹੈ", + "Javanese": "Masakane ibuku enak", + "Korean": "엄마가 해주는 요리는 맛있어", + "French": "La cuisine de ma mère est délicieuse", + "German": "Die Küche meiner Mutter ist köstlich" + }, + { + "English": "We have a family pet", + "sceneType": "Family", + "Chinese (Simplified)": "我们有一只家庭宠物", + "Spanish": "tenemos una mascota familiar", + "Hindi": "हमारे पास एक पारिवारिक पालतू जानवर है", + "Arabic": "لدينا حيوان أليف للعائلة", + "Portuguese": "temos um animal de estimação da família", + "Bengali": "আমাদের একটি পারিবারিক পোষা প্রাণী আছে", + "Russian": "у нас есть домашний питомец", + "Japanese": "私たちは家族のペットを飼っています", + "Punjabi": "ਸਾਡੇ ਕੋਲ ਇੱਕ ਪਰਿਵਾਰਕ ਪਾਲਤੂ ਜਾਨਵਰ ਹੈ", + "Javanese": "kita duwe pet kulawarga", + "Korean": "우리 가족 애완동물이 있어요", + "French": "nous avons un animal de compagnie", + "German": "Wir haben ein Familienhaustier" + }, + { + "English": "My parents are very supportive", + "sceneType": "Family", + "Chinese (Simplified)": "我的父母很支持我", + "Spanish": "mis padres me apoyan mucho", + "Hindi": "मेरे माता-पिता मेरा बहुत समर्थन करते हैं", + "Arabic": "والدي يدعمونني كثيرًا", + "Portuguese": "Meus pais me apoiam muito", + "Russian": "Мои родители меня очень поддерживают", + "Japanese": "両親は私をとても応援してくれています", + "Punjabi": "ਮੇਰੇ ਮਾਤਾ-ਪਿਤਾ ਮੇਰਾ ਬਹੁਤ ਸਹਿਯੋਗ ਕਰਦੇ ਹਨ", + "Javanese": "Wong tuwaku banget ndhukung aku", + "Korean": "나의 부모님은 나를 매우 지지하신다.", + "French": "Mes parents me soutiennent beaucoup", + "German": "Meine Eltern unterstützen mich sehr" + }, + { + "English": "I enjoy spending time with my family", + "sceneType": "Family", + "Chinese (Simplified)": "我喜欢和家人共度时光", + "Spanish": "Me gusta pasar tiempo con mi familia.", + "Hindi": "मुझे अपने परिवार के साथ समय बिताना पसंद है", + "Arabic": "أحب قضاء الوقت مع عائلتي", + "Portuguese": "Gosto de passar tempo com minha família", + "Bengali": "আমি আমার পরিবারের সাথে সময় কাটাতে পছন্দ করি", + "Russian": "Мне нравится проводить время со своей семьей", + "Japanese": "家族と一緒に時間を過ごすのが好きです", + "Punjabi": "ਮੈਨੂੰ ਆਪਣੇ ਪਰਿਵਾਰ ਨਾਲ ਸਮਾਂ ਬਿਤਾਉਣਾ ਪਸੰਦ ਹੈ", + "Javanese": "Aku seneng nglampahi wektu karo kulawarga", + "Korean": "나는 가족과 함께 시간을 보내는 것을 좋아한다", + "French": "J'aime passer du temps avec ma famille", + "German": "Ich verbringe gerne Zeit mit meiner Familie" + }, + { + "English": "We have a family tradition", + "sceneType": "Family", + "Chinese (Simplified)": "我们有一个家庭传统", + "Spanish": "tenemos una tradición familiar", + "Hindi": "हमारी एक पारिवारिक परंपरा है", + "Arabic": "لدينا تقليد عائلي", + "Portuguese": "temos uma tradição familiar", + "Bengali": "আমাদের পারিবারিক ঐতিহ্য আছে", + "Russian": "у нас есть семейная традиция", + "Japanese": "私たちには家族の伝統があります", + "Punjabi": "ਸਾਡੀ ਇੱਕ ਪਰਿਵਾਰਕ ਪਰੰਪਰਾ ਹੈ", + "Javanese": "kita duwe tradisi kulawarga", + "Korean": "우리에겐 가문의 전통이 있어요", + "French": "nous avons une tradition familiale", + "German": "Wir haben eine Familientradition" + }, + { + "English": "Family gatherings are fun", + "sceneType": "Family", + "Chinese (Simplified)": "家庭聚会很有趣", + "Spanish": "Las reuniones familiares son divertidas", + "Hindi": "पारिवारिक समारोह मज़ेदार होते हैं", + "Arabic": "التجمعات العائلية ممتعة", + "Portuguese": "Reuniões de família são divertidas", + "Bengali": "পারিবারিক সমাবেশগুলি মজাদার", + "Russian": "Семейные посиделки – это весело", + "Japanese": "家族の集まりは楽しい", + "Punjabi": "ਪਰਿਵਾਰਕ ਇਕੱਠ ਮਜ਼ੇਦਾਰ ਹਨ", + "Javanese": "Kumpul keluarga seneng", + "Korean": "가족 모임은 즐겁습니다", + "French": "Les réunions de famille sont amusantes", + "German": "Familientreffen machen Spaß" + }, + { + "English": "My uncle is visiting us", + "sceneType": "Family", + "Chinese (Simplified)": "我叔叔来看我们", + "Spanish": "mi tio vino a vernos", + "Hindi": "मेरे चाचा हमसे मिलने आये", + "Arabic": "جاء عمي لرؤيتنا", + "Portuguese": "Meu tio veio nos ver", + "Bengali": "আমার চাচা আমাদের দেখতে এসেছেন", + "Russian": "Мой дядя пришёл к нам", + "Japanese": "私の叔父が私たちに会いに来ました", + "Punjabi": "ਮੇਰਾ ਚਾਚਾ ਸਾਨੂੰ ਮਿਲਣ ਆਇਆ", + "Javanese": "Pakdhe teka niliki", + "Korean": "삼촌이 우리를 만나러 오셨어요", + "French": "Mon oncle est venu nous voir", + "German": "Mein Onkel kam, um uns zu besuchen" + }, + { + "English": "I miss my family", + "sceneType": "Family", + "Chinese (Simplified)": "我想念我的家人", + "Spanish": "extraño a mi familia", + "Hindi": "मुझे अपने परिवार की याद आती है", + "Arabic": "افتقد عائلتي", + "Portuguese": "Eu sinto falta da minha familia", + "Bengali": "আমি আমার পরিবারকে অনুভব করি", + "Russian": "я скучаю по своей семье", + "Japanese": "家族に会いたい", + "Punjabi": "ਮੈਨੂੰ ਆਪਣੇ ਪਰਿਵਾਰ ਦੀ ਯਾਦ ਆਉਂਦੀ ਹੈ", + "Javanese": "aku kangen keluargaku", + "Korean": "나는 가족이 그리워요", + "French": "Ma famille me manque", + "German": "ich vermisse meine Familie" + }, + { + "English": "We have a family photo album", + "sceneType": "Family", + "Chinese (Simplified)": "我们有一本家庭相册", + "Spanish": "Tenemos un álbum de fotos familiar.", + "Hindi": "हमारे पास एक पारिवारिक फोटो एलबम है", + "Arabic": "لدينا ألبوم صور العائلة", + "Portuguese": "Temos um álbum de fotos de família", + "Bengali": "আমরা একটি পারিবারিক ছবির অ্যালবাম আছে", + "Russian": "У нас есть семейный фотоальбом.", + "Japanese": "我が家には家族写真のアルバムがあります", + "Punjabi": "ਸਾਡੇ ਕੋਲ ਇੱਕ ਪਰਿਵਾਰਕ ਫੋਟੋ ਐਲਬਮ ਹੈ", + "Javanese": "Kita duwe album foto kulawarga", + "Korean": "가족사진앨범이 있어요", + "French": "Nous avons un album photo de famille", + "German": "Wir haben ein Familienfotoalbum" + }, + { + "English": "My aunt is a teacher", + "sceneType": "Family", + "Chinese (Simplified)": "我阿姨是老师", + "Spanish": "Mi tía es una profesora", + "Hindi": "मेरी चाची एक शिक्षक है", + "Arabic": "عمتي معلمة", + "Portuguese": "Minha tia é professora", + "Bengali": "আমার খালা একজন শিক্ষক", + "Russian": "Моя тетя учитель", + "Japanese": "私の叔母は教師です", + "Punjabi": "ਮੇਰੀ ਮਾਸੀ ਇੱਕ ਅਧਿਆਪਕ ਹੈ", + "Javanese": "Bulikku guru", + "Korean": "이모는 선생님이에요", + "French": "Ma tante est enseignante", + "German": "Meine Tante ist Lehrerin" + }, + { + "English": "Family means everything to me", + "sceneType": "Family", + "Chinese (Simplified)": "家庭对我来说意味着一切", + "Spanish": "la familia lo es todo para mi", + "Hindi": "परिवार मेरे लिए सब कुछ है", + "Arabic": "الأسرة تعني كل شيء بالنسبة لي", + "Portuguese": "família significa tudo para mim", + "Bengali": "পরিবার মানে আমার কাছে সবকিছু", + "Russian": "семья значит для меня все", + "Japanese": "私にとって家族はすべてです", + "Punjabi": "ਪਰਿਵਾਰ ਦਾ ਮਤਲਬ ਮੇਰੇ ਲਈ ਸਭ ਕੁਝ ਹੈ", + "Javanese": "kulawarga tegese kabeh kanggo kula", + "Korean": "가족은 나에게 모든 것을 의미합니다", + "French": "la famille signifie tout pour moi", + "German": "Familie bedeutet mir alles" + }, + { + "English": "We watch movies together", + "sceneType": "Family", + "Chinese (Simplified)": "我们一起看电影", + "Spanish": "veamos una película juntos", + "Hindi": "चलो साथ में मूवी देखते हैं", + "Arabic": "دعونا نشاهد فيلما معا", + "Portuguese": "Vamos assistir um filme juntos", + "Bengali": "আসুন একসাথে একটি সিনেমা দেখি", + "Russian": "Давай посмотрим фильм вместе", + "Japanese": "一緒に映画を見ましょう", + "Punjabi": "ਆਉ ਇਕੱਠੇ ਇੱਕ ਫਿਲਮ ਦੇਖਦੇ ਹਾਂ", + "Javanese": "Ayo nonton film bareng", + "Korean": "같이 영화를 보자", + "French": "Regardons un film ensemble", + "German": "Schauen wir uns gemeinsam einen Film an" + }, + { + "English": "My cousin is my best friend", + "sceneType": "Family", + "Chinese (Simplified)": "我的堂兄是我最好的朋友", + "Spanish": "mi prima es mi mejor amiga", + "Hindi": "मेरा चचेरा भाई मेरा सबसे अच्छा दोस्त है", + "Arabic": "ابن عمي هو أفضل صديق لي", + "Portuguese": "meu primo é meu melhor amigo", + "Bengali": "আমার কাজিন আমার সবচেয়ে ভালো বন্ধু", + "Russian": "мой двоюродный брат мой лучший друг", + "Japanese": "私のいとこは私の親友です", + "Punjabi": "ਮੇਰਾ ਚਚੇਰਾ ਭਰਾ ਮੇਰਾ ਸਭ ਤੋਂ ਵਧੀਆ ਦੋਸਤ ਹੈ", + "Javanese": "sedulurku iku kanca apikku", + "Korean": "내 사촌은 나의 가장 친한 친구야", + "French": "mon cousin est mon meilleur ami", + "German": "Mein Cousin ist mein bester Freund" + }, + { + "English": "We have family game nights", + "sceneType": "Family", + "Chinese (Simplified)": "我们有家庭游戏之夜", + "Spanish": "tenemos noche de juegos en familia", + "Hindi": "हमारे पास पारिवारिक खेल की रात है", + "Arabic": "لدينا ليلة لعبة عائلية", + "Portuguese": "temos noite de jogos em família", + "Bengali": "আমাদের পারিবারিক খেলার রাত আছে", + "Russian": "у нас вечер семейных игр", + "Japanese": "ファミリーゲームナイトがあります", + "Punjabi": "ਸਾਡੇ ਕੋਲ ਪਰਿਵਾਰਕ ਖੇਡ ਦੀ ਰਾਤ ਹੈ", + "Javanese": "kita duwe wengi game kulawarga", + "Korean": "우리는 가족 게임의 밤이 있어요", + "French": "nous avons une soirée de jeux en famille", + "German": "Wir haben einen Familienspieleabend" + }, + { + "English": "My brother plays football", + "sceneType": "Family", + "Chinese (Simplified)": "我弟弟踢足球", + "Spanish": "mi hermano juega futbol", + "Hindi": "मेरा भाई फुटबॉल खेलता है", + "Arabic": "أخي يلعب كرة القدم", + "Portuguese": "meu irmão joga futebol", + "Bengali": "আমার ভাই ফুটবল খেলে", + "Russian": "мой брат играет в футбол", + "Japanese": "私の兄はサッカーをします", + "Punjabi": "ਮੇਰਾ ਭਰਾ ਫੁੱਟਬਾਲ ਖੇਡਦਾ ਹੈ", + "Javanese": "adhiku main bal-balan", + "Korean": "내 동생은 축구를 해요", + "French": "mon frère joue au football", + "German": "Mein Bruder spielt Fußball" + }, + { + "English": "My sister likes to read", + "sceneType": "Family", + "Chinese (Simplified)": "我妹妹喜欢读书", + "Spanish": "a mi hermana le gusta leer", + "Hindi": "मेरी बहन को पढ़ना पसंद है", + "Arabic": "أختي تحب القراءة", + "Portuguese": "Minha irmã gosta de ler", + "Bengali": "আমার বোন পড়তে পছন্দ করে", + "Russian": "Моя сестра любит читать", + "Japanese": "私の妹は読書が好きです", + "Punjabi": "ਮੇਰੀ ਭੈਣ ਪੜ੍ਹਨਾ ਪਸੰਦ ਕਰਦੀ ਹੈ", + "Javanese": "Adhiku seneng maca", + "Korean": "내 여동생은 책 읽는 걸 좋아해요", + "French": "Ma sœur aime lire", + "German": "Meine Schwester liest gern" + }, + { + "English": "We go on family vacations", + "sceneType": "Family", + "Chinese (Simplified)": "我们去家庭度假", + "Spanish": "nos vamos de vacaciones en familia", + "Hindi": "हम पारिवारिक छुट्टियों पर जाते हैं", + "Arabic": "نذهب في إجازة عائلية", + "Portuguese": "vamos de férias em família", + "Bengali": "আমরা একটি পারিবারিক ছুটিতে যাই", + "Russian": "мы едем на семейный отдых", + "Japanese": "私たちは家族旅行に行きます", + "Punjabi": "ਅਸੀਂ ਪਰਿਵਾਰਕ ਛੁੱਟੀਆਂ 'ਤੇ ਜਾਂਦੇ ਹਾਂ", + "Javanese": "kita pindhah ing vacation kulawarga", + "Korean": "우리는 가족 휴가를 간다", + "French": "nous partons en vacances en famille", + "German": "Wir machen einen Familienurlaub" + }, + { + "English": "My father teaches me many things", + "sceneType": "Family", + "Chinese (Simplified)": "我爸爸教了我很多东西", + "Spanish": "mi papa me enseño mucho", + "Hindi": "मेरे पिताजी ने मुझे बहुत कुछ सिखाया", + "Arabic": "علمني والدي الكثير", + "Portuguese": "meu pai me ensinou muito", + "Bengali": "আমার বাবা আমাকে অনেক কিছু শিখিয়েছেন", + "Russian": "мой отец многому меня научил", + "Japanese": "父は私にたくさんのことを教えてくれました", + "Punjabi": "ਮੇਰੇ ਡੈਡੀ ਨੇ ਮੈਨੂੰ ਬਹੁਤ ਕੁਝ ਸਿਖਾਇਆ", + "Javanese": "bapakku ngajari aku akeh", + "Korean": "우리 아빠는 나에게 많은 것을 가르쳐 주셨어", + "French": "mon père m'a beaucoup appris", + "German": "Mein Vater hat mir viel beigebracht" + }, + { + "English": "My mother is very kind", + "sceneType": "Family", + "Chinese (Simplified)": "我妈妈很善良", + "Spanish": "mi madre es muy amable", + "Hindi": "मेरी मां बहुत दयालु हैं", + "Arabic": "والدتي لطيفة جدا", + "Portuguese": "minha mãe é muito gentil", + "Bengali": "আমার মা খুব দয়ালু", + "Russian": "моя мама очень добрая", + "Japanese": "私の母はとても親切です", + "Punjabi": "ਮੇਰੀ ਮਾਂ ਬਹੁਤ ਦਿਆਲੂ ਹੈ", + "Javanese": "ibuku apikan banget", + "Korean": "우리 엄마는 정말 친절해요", + "French": "ma mère est très gentille", + "German": "Meine Mutter ist sehr nett" + }, + { + "English": "We have a big family", + "sceneType": "Family", + "Chinese (Simplified)": "我们有一个大家庭", + "Spanish": "tenemos una gran familia", + "Hindi": "हमारा एक बड़ा परिवार है", + "Arabic": "لدينا عائلة كبيرة", + "Portuguese": "temos uma grande família", + "Bengali": "আমাদের একটি বড় পরিবার আছে", + "Russian": "у нас большая семья", + "Japanese": "私たちには大家族がいます", + "Punjabi": "ਸਾਡਾ ਇੱਕ ਵੱਡਾ ਪਰਿਵਾਰ ਹੈ", + "Javanese": "kita duwe kulawarga gedhe", + "Korean": "우리는 대가족이 있어요", + "French": "nous avons une grande famille", + "German": "wir haben eine große Familie" + }, + { + "English": "Family love is unconditional", + "sceneType": "Family", + "Chinese (Simplified)": "家庭的爱是无条件的", + "Spanish": "El amor familiar es incondicional.", + "Hindi": "पारिवारिक प्रेम बिना शर्त होता है", + "Arabic": "حب العائلة غير مشروط", + "Portuguese": "O amor familiar é incondicional", + "Bengali": "পারিবারিক ভালোবাসা নিঃশর্ত", + "Russian": "Семейная любовь безусловна", + "Japanese": "家族の愛は無条件です", + "Punjabi": "ਪਰਿਵਾਰਕ ਪਿਆਰ ਬਿਨਾਂ ਸ਼ਰਤ ਹੈ", + "Javanese": "Katresnan kulawarga iku tanpa syarat", + "Korean": "가족사랑은 무조건적이다", + "French": "L'amour familial est inconditionnel", + "German": "Familienliebe ist bedingungslos" + }, + { + "English": "My nephew is very cute", + "sceneType": "Family", + "Chinese (Simplified)": "我的侄子很可爱", + "Spanish": "mi sobrino es lindo", + "Hindi": "मेरा भतीजा प्यारा है", + "Arabic": "ابن أخي لطيف", + "Portuguese": "meu sobrinho é fofo", + "Bengali": "আমার ভাতিজা সুন্দর", + "Russian": "мой племянник милый", + "Japanese": "私の甥っ子はかわいいです", + "Punjabi": "ਮੇਰਾ ਭਤੀਜਾ ਪਿਆਰਾ ਹੈ", + "Javanese": "ponakanku lucu", + "Korean": "내 조카가 귀여워요", + "French": "mon neveu est mignon" + }, + { + "English": "We celebrate birthdays together", + "sceneType": "Family", + "Chinese (Simplified)": "我们一起庆祝生日", + "Spanish": "Celebremos el cumpleaños juntos", + "Hindi": "आइए मिलकर जन्मदिन मनाएं", + "Arabic": "دعونا نحتفل بعيد ميلاد معا", + "Portuguese": "Vamos comemorar aniversário juntos", + "Bengali": "আসুন একসাথে জন্মদিন উদযাপন করি", + "Russian": "Давайте отпразднуем день рождения вместе", + "Japanese": "一緒に誕生日を祝いましょう", + "Punjabi": "ਆਓ ਮਿਲ ਕੇ ਜਨਮ ਦਿਨ ਮਨਾਈਏ", + "Javanese": "Ayo padha ngrayakake ulang tahun bebarengan", + "Korean": "함께 생일을 축하하자", + "French": "Célébrons l'anniversaire ensemble", + "German": "Lasst uns gemeinsam Geburtstag feiern" + }, + { + "English": "My niece is learning to walk", + "sceneType": "Family", + "Chinese (Simplified)": "我的侄女正在学走路", + "Spanish": "mi sobrina esta aprendiendo a caminar", + "Hindi": "मेरी भतीजी चलना सीख रही है", + "Arabic": "ابنة أخي تتعلم المشي", + "Portuguese": "Minha sobrinha está aprendendo a andar", + "Bengali": "আমার ভাগ্নি হাঁটতে শিখছে", + "Russian": "Моя племянница учится ходить", + "Japanese": "私の姪は歩くことを学んでいます", + "Punjabi": "ਮੇਰੀ ਭਤੀਜੀ ਤੁਰਨਾ ਸਿੱਖ ਰਹੀ ਹੈ", + "Javanese": "Keponakanku lagi sinau mlaku", + "Korean": "내 조카가 걷는 법을 배우고 있어요", + "French": "Ma nièce apprend à marcher", + "German": "Meine Nichte lernt laufen" + }, + { + "English": "We share everything", + "sceneType": "Family", + "Chinese (Simplified)": "我们分享一切", + "Spanish": "compartimos todo", + "Hindi": "हम सब कुछ साझा करते हैं", + "Arabic": "نحن نشارك كل شيء", + "Portuguese": "nós compartilhamos tudo", + "Bengali": "আমরা সবকিছু শেয়ার করি", + "Russian": "мы делимся всем", + "Japanese": "私たちはすべてを共有します", + "Punjabi": "ਅਸੀਂ ਸਭ ਕੁਝ ਸਾਂਝਾ ਕਰਦੇ ਹਾਂ", + "Javanese": "kita nuduhake kabeh", + "Korean": "우리는 모든 것을 공유합니다", + "French": "nous partageons tout", + "German": "wir teilen alles" + }, + { + "English": "My family supports my dreams", + "sceneType": "Family", + "Chinese (Simplified)": "我的家人支持我的梦想", + "Spanish": "Mi familia apoya mi sueño.", + "Hindi": "मेरा परिवार मेरे सपने का समर्थन करता है", + "Arabic": "عائلتي تدعم حلمي", + "Portuguese": "Minha família apoia meu sonho", + "Bengali": "আমার পরিবার আমার স্বপ্নকে সমর্থন করে", + "Russian": "Моя семья поддерживает мою мечту", + "Japanese": "家族が私の夢を応援してくれる", + "Punjabi": "ਮੇਰਾ ਪਰਿਵਾਰ ਮੇਰੇ ਸੁਪਨੇ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ", + "Javanese": "Kulawarga ndhukung impenku", + "Korean": "가족은 나의 꿈을 지지한다", + "French": "Ma famille soutient mon rêve", + "German": "Meine Familie unterstützt meinen Traum" + }, + { + "English": "I learn a lot from my family", + "sceneType": "Family", + "Chinese (Simplified)": "我从家人那里学到了很多", + "Spanish": "aprendí mucho de mi familia", + "Hindi": "मैंने अपने परिवार से बहुत कुछ सीखा", + "Arabic": "لقد تعلمت الكثير من عائلتي", + "Portuguese": "Aprendi muito com minha família", + "Bengali": "আমি আমার পরিবার থেকে অনেক কিছু শিখেছি", + "Russian": "Я многому научился у своей семьи", + "Japanese": "家族からたくさんのことを学びました", + "Punjabi": "ਮੈਂ ਆਪਣੇ ਪਰਿਵਾਰ ਤੋਂ ਬਹੁਤ ਕੁਝ ਸਿੱਖਿਆ", + "Javanese": "Aku sinau akeh saka kulawarga", + "Korean": "나는 가족에게서 많은 것을 배웠다.", + "French": "J'ai beaucoup appris de ma famille", + "German": "Ich habe viel von meiner Familie gelernt" + }, + { + "English": "We have a family garden", + "sceneType": "Family", + "Spanish": "tenemos un huerto en casa", + "Hindi": "हमारे पास एक घरेलू बगीचा है", + "Arabic": "لدينا حديقة منزلية", + "Portuguese": "temos uma horta em casa", + "Bengali": "আমাদের একটি বাড়ির বাগান আছে", + "Russian": "у нас есть домашний сад", + "Japanese": "私たちは家庭菜園を持っています", + "Punjabi": "ਸਾਡੇ ਕੋਲ ਇੱਕ ਘਰੇਲੂ ਬਗੀਚਾ ਹੈ", + "Javanese": "kita duwe kebon omah", + "Korean": "우리 집 정원이 있어요", + "French": "nous avons un jardin potager", + "German": "Wir haben einen Hausgarten" + }, + { + "English": "Family time is the best time", + "sceneType": "Family", + "Chinese (Simplified)": "家庭时光是最好的时光", + "Spanish": "El tiempo en familia es el mejor momento.", + "Hindi": "पारिवारिक समय सबसे अच्छा समय है", + "Arabic": "وقت العائلة هو أفضل وقت", + "Portuguese": "O tempo em família é o melhor momento", + "Bengali": "পারিবারিক সময় সবচেয়ে ভালো সময়", + "Russian": "Время с семьей – лучшее время", + "Japanese": "家族の時間は最高の時間です", + "Punjabi": "ਪਰਿਵਾਰਕ ਸਮਾਂ ਸਭ ਤੋਂ ਵਧੀਆ ਸਮਾਂ ਹੈ", + "Javanese": "Wektu kulawarga iku wektu sing paling apik", + "Korean": "가족의 시간이 가장 좋은 시간이다", + "French": "Le temps en famille est le meilleur moment", + "German": "Familienzeit ist die beste Zeit" + }, + { + "English": "My brother is very talented", + "sceneType": "Family", + "Chinese (Simplified)": "我哥哥很有才华", + "Spanish": "mi hermano es muy talentoso", + "Hindi": "मेरा भाई बहुत प्रतिभाशाली है", + "Arabic": "أخي موهوب جدا", + "Portuguese": "Meu irmão é muito talentoso", + "Bengali": "আমার ভাই খুব মেধাবী", + "Russian": "Мой брат очень талантлив", + "Japanese": "私の兄はとても才能があります", + "Punjabi": "ਮੇਰਾ ਭਰਾ ਬਹੁਤ ਪ੍ਰਤਿਭਾਸ਼ਾਲੀ ਹੈ", + "Javanese": "Kakangku bakat banget", + "Korean": "내 동생은 정말 재능이 있어", + "French": "Mon frère est très talentueux", + "German": "Mein Bruder ist sehr talentiert" + }, + { + "English": "We celebrate New Year's together", + "sceneType": "Family", + "Chinese (Simplified)": "我们一起庆祝新年", + "Spanish": "Celebremos juntos el año nuevo.", + "Hindi": "आइए मिलकर नया साल मनाएं", + "Arabic": "دعونا نحتفل بالعام الجديد معا", + "Portuguese": "Vamos comemorar o ano novo juntos", + "Bengali": "আসুন একসাথে নতুন বছর উদযাপন করি", + "Russian": "Давайте встретим новый год вместе", + "Japanese": "一緒に新年を祝いましょう", + "Punjabi": "ਆਓ ਮਿਲ ਕੇ ਨਵਾਂ ਸਾਲ ਮਨਾਈਏ", + "Javanese": "Ayo padha ngrayakake taun anyar bebarengan", + "Korean": "새해를 함께 축하해요", + "French": "Célébrons la nouvelle année ensemble", + "German": "Lasst uns gemeinsam das neue Jahr feiern" + }, + { + "English": "My parents are my role models", + "sceneType": "Family", + "Chinese (Simplified)": "我的父母是我的榜样", + "Spanish": "mis padres son mis modelos a seguir", + "Hindi": "मेरे माता-पिता मेरे आदर्श हैं", + "Arabic": "والدي هم قدوة لي", + "Portuguese": "meus pais são meus modelos", + "Bengali": "আমার বাবা-মা আমার আদর্শ", + "Russian": "мои родители — мой образец для подражания", + "Japanese": "私の両親は私のロールモデルです", + "Punjabi": "ਮੇਰੇ ਮਾਪੇ ਮੇਰੇ ਰੋਲ ਮਾਡਲ ਹਨ", + "Javanese": "wong tuwaku dadi panutanku", + "Korean": "우리 부모님은 나의 롤모델이다", + "French": "mes parents sont mes modèles", + "German": "Meine Eltern sind meine Vorbilder" + }, + { + "English": "I love my family gatherings", + "sceneType": "Family", + "Chinese (Simplified)": "我喜欢家庭聚会", + "Hindi": "मुझे पारिवारिक समारोह पसंद हैं", + "Arabic": "أحب التجمعات العائلية", + "Portuguese": "adoro reuniões de família", + "Bengali": "আমি পারিবারিক সমাবেশ পছন্দ করি", + "Russian": "я люблю семейные встречи", + "Japanese": "私は家族の集まりが大好きです", + "Punjabi": "ਮੈਨੂੰ ਪਰਿਵਾਰਕ ਇਕੱਠ ਪਸੰਦ ਹਨ", + "Javanese": "aku seneng kumpul keluarga", + "Korean": "나는 가족 모임을 좋아해요", + "French": "j'adore les réunions de famille", + "German": "Ich liebe Familientreffen" + }, + { + "English": "We support each other", + "sceneType": "Family", + "Chinese (Simplified)": "我们互相支持", + "Spanish": "nos apoyamos unos a otros", + "Hindi": "हम एक दूसरे का समर्थन करते हैं", + "Arabic": "نحن ندعم بعضنا البعض", + "Portuguese": "nós apoiamos um ao outro", + "Bengali": "আমরা একে অপরকে সমর্থন করি", + "Russian": "мы поддерживаем друг друга", + "Japanese": "私たちはお互いをサポートします", + "Punjabi": "ਅਸੀਂ ਇੱਕ ਦੂਜੇ ਦਾ ਸਮਰਥਨ ਕਰਦੇ ਹਾਂ", + "Javanese": "kita saling dukung", + "Korean": "우리는 서로를 지지한다", + "French": "nous nous soutenons", + "German": "wir unterstützen uns gegenseitig" + } + ] + }, + { + "sceneSource": "Travel", + "sceneType": "Travel", + "sceneList": [ + { + "English": "Where is the nearest hotel?", + "sceneType": "Travel", + "Chinese (Simplified)": "最近的酒店在哪里?", + "Spanish": "¿Dónde está el hotel más cercano?", + "Hindi": "निकटतम होटल कहां है?", + "Arabic": "أين يقع أقرب فندق؟", + "Portuguese": "Onde é o hotel mais próximo?", + "Bengali": "কাছের হোটেল কোথায়?", + "Russian": "Где находится ближайший отель?", + "Japanese": "最寄りのホテルはどこですか?", + "Punjabi": "ਨਜਦੀਕ ਹੋਟਲ ਕਿੱਥੇ ਹੈ?", + "Javanese": "Ing endi hotel sing paling cedhak?", + "Korean": "가장 가까운 호텔은 어디인가요?", + "French": "Où est l'hôtel le plus proche?", + "German": "Wo ist das nächste Hotel?" + }, + { + "English": "I need a map", + "sceneType": "Travel", + "Chinese (Simplified)": "我需要一张地图", + "Spanish": "necesito un mapa", + "Hindi": "मुझे एक मानचित्र चाहिए", + "Arabic": "أحتاج إلى خريطة", + "Portuguese": "eu preciso de um mapa", + "Bengali": "আমার একটি মানচিত্র দরকার", + "Russian": "мне нужна карта", + "Japanese": "地図が必要です", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਨਕਸ਼ਾ ਚਾਹੀਦਾ ਹੈ", + "Javanese": "aku butuh peta", + "Korean": "지도가 필요해", + "French": "j'ai besoin d'une carte", + "German": "Ich brauche eine Karte" + }, + { + "English": "What time is the next bus?", + "sceneType": "Travel", + "Chinese (Simplified)": "下一班公交车几点?", + "Spanish": "¿A qué hora sale el próximo autobús?", + "Hindi": "अगली बस कितने बजे है?", + "Arabic": "ما هو وقت الحافلة القادمة؟", + "Portuguese": "A que horas é o próximo ônibus?", + "Bengali": "পরের বাস কয়টা?", + "Russian": "Во сколько следующий автобус?", + "Japanese": "次のバスは何時ですか?", + "Punjabi": "ਅਗਲੀ ਬੱਸ ਕਿੰਨੇ ਵਜੇ ਹੈ?", + "Javanese": "Jam pira bis sabanjure?", + "Korean": "다음 버스는 몇 시입니까?", + "French": "À quelle heure est le prochain bus ?", + "German": "Wann fährt der nächste Bus?" + }, + { + "English": "Can you recommend a good restaurant?", + "sceneType": "Travel", + "Chinese (Simplified)": "你能推荐一家好餐馆吗?", + "Spanish": "¿Podría recomendarme un buen restaurante?", + "Hindi": "क्या आप एक अच्छे रेस्तरां की सिफारिश कर सकते हैं?", + "Arabic": "هل تستطيع أن تقترح اسم مطعم جيد؟", + "Portuguese": "Você pode recomendar um bom restaurante?", + "Bengali": "আপনি একটি ভাল রেস্টুরেন্ট সুপারিশ করতে পারেন?", + "Russian": "Вы можете порекомендовать хороший ресторан?", + "Japanese": "良いレストランをお勧めして頂けますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਕਿਸੇ ਚੰਗੇ ਰੈਸਟੋਰੈਂਟ ਦਾ ਸੁਝਾਵ ਦੇ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa menehi rekomendasi restoran sing apik?", + "Korean": "좋은 레스토랑을 추천해 주실 수 있나요?", + "French": "Pouvez-vous recommander un bon restaurant?", + "German": "Können Sie ein gutes Restaurant empfehlen?" + }, + { + "English": "I lost my luggage", + "sceneType": "Travel", + "Chinese (Simplified)": "我的行李丢了", + "Spanish": "mi equipaje esta perdido", + "Hindi": "मेरा सामान खो गया है", + "Arabic": "فقدت أمتعتي", + "Portuguese": "Minha bagagem está perdida", + "Bengali": "আমার লাগেজ হারিয়ে গেছে", + "Russian": "Мой багаж потерян", + "Japanese": "荷物が紛失してしまいました", + "Punjabi": "ਮੇਰਾ ਸਮਾਨ ਗੁਆਚ ਗਿਆ ਹੈ", + "Javanese": "Barangku ilang", + "Korean": "내 짐이 분실됐어요", + "French": "Mes bagages sont perdus", + "German": "Mein Gepäck ist verloren" + }, + { + "English": "How do I get to the airport?", + "sceneType": "Travel", + "Chinese (Simplified)": "我怎么去机场?", + "Spanish": "¿Cómo llego al aeropuerto?", + "Hindi": "एयरपोर्ट कैसे जाया जा सकता है?", + "Arabic": "كيف يمكنني الوصول إلى المطار؟", + "Portuguese": "Como chego ao aeroporto?", + "Bengali": "আমি কিভাবে বিমানবন্দরে যেতে পারি?", + "Russian": "Как мне добраться до аэропорта?", + "Japanese": "私はどうすれば空港に行けますか?", + "Punjabi": "ਮੈਂ ਹਵਾਈ ਅੱਡੇ ਤੱਕ ਕਿਵੇਂ ਪਹੁੰਚਾਂ?", + "Javanese": "Carane aku njaluk menyang bandara?", + "Korean": "공항에 어떻게 가야합니까?", + "French": "Comment puis-je me rendre à l'aéroport?", + "German": "Wie komme ich zum Flughafen?" + }, + { + "English": "Is there a bus to the city center?", + "sceneType": "Travel", + "Chinese (Simplified)": "有去市中心的公交车吗?", + "Spanish": "¿Hay autobús al centro de la ciudad?", + "Hindi": "क्या शहर के केंद्र के लिए कोई बस है?", + "Arabic": "هل هناك حافلة إلى وسط المدينة؟", + "Portuguese": "Existe ônibus para o centro da cidade?", + "Bengali": "শহরের কেন্দ্রে একটি বাস আছে?", + "Russian": "Есть ли автобус до центра города?", + "Japanese": "市内中心部行きのバスはありますか?", + "Punjabi": "ਕੀ ਸ਼ਹਿਰ ਦੇ ਕੇਂਦਰ ਲਈ ਕੋਈ ਬੱਸ ਹੈ?", + "Javanese": "Apa ana bis menyang pusat kutha?", + "Korean": "시내 중심가까지 가는 버스가 있나요?", + "French": "Y a-t-il un bus pour le centre-ville ?", + "German": "Gibt es einen Bus in die Innenstadt?" + }, + { + "English": "What is the best way to get around?", + "sceneType": "Travel", + "Chinese (Simplified)": "最好的出行方式是什么?", + "Spanish": "¿Cuál es la mejor manera de moverse?", + "Hindi": "घूमने का सबसे अच्छा तरीका क्या है?", + "Arabic": "ما هي أفضل طريقة للتجول؟", + "Portuguese": "Qual é a melhor maneira de se locomover?", + "Bengali": "কাছাকাছি পেতে সেরা উপায় কি?", + "Russian": "Как лучше всего передвигаться?", + "Japanese": "一番良い移動方法は何ですか?", + "Punjabi": "ਆਲੇ ਦੁਆਲੇ ਜਾਣ ਦਾ ਸਭ ਤੋਂ ਵਧੀਆ ਤਰੀਕਾ ਕੀ ਹੈ?", + "Javanese": "Apa cara paling apik kanggo ngubengi?", + "Korean": "돌아다니는 가장 좋은 방법은 무엇인가요?", + "French": "Quelle est la meilleure façon de se déplacer ?", + "German": "Wie kann man sich am besten fortbewegen?" + }, + { + "English": "Where can I buy a ticket?", + "sceneType": "Travel", + "Chinese (Simplified)": "我在哪里可以买票?", + "Spanish": "¿Dónde puedo comprar las entradas?", + "Hindi": "मैं टिकट कहाँ से खरीद सकता हूँ?", + "Arabic": "أين يمكنني شراء التذاكر؟", + "Portuguese": "Onde posso comprar os bilhetes?", + "Bengali": "আমি কোথায় টিকিট কিনতে পারি?", + "Russian": "Где я могу купить билеты?", + "Japanese": "チケットはどこで買えますか?", + "Punjabi": "ਮੈਂ ਟਿਕਟਾਂ ਕਿਥੋਂ ਖ਼ਰੀਦ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Ing endi bisa tuku tiket?", + "Korean": "티켓은 어디서 살 수 있나요?", + "French": "Où puis-je acheter des billets?", + "German": "Wo kann ich Tickets kaufen?" + }, + { + "English": "Can you show me on the map?", + "sceneType": "Travel", + "Chinese (Simplified)": "你能在地图上给我指一下吗?", + "Spanish": "¿Puedes indicarme dónde está en el mapa?", + "Hindi": "क्या आप मुझे मानचित्र पर इसकी ओर संकेत कर सकते हैं?", + "Arabic": "هل يمكنك أن تدلني عليه على الخريطة؟", + "Portuguese": "Você pode me indicar isso no mapa?", + "Bengali": "আপনি মানচিত্রে এটি আমাকে নির্দেশ করতে পারেন?", + "Russian": "Можете ли вы указать мне это на карте?", + "Japanese": "地図上でそれを教えてもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੈਨੂੰ ਨਕਸ਼ੇ 'ਤੇ ਇਸ ਵੱਲ ਇਸ਼ਾਰਾ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa nuding aku ing peta?", + "Korean": "지도에서 그 곳을 가리킬 수 있나요?", + "French": "Pouvez-vous me l'indiquer sur la carte ?", + "German": "Können Sie mir den Ort auf der Karte zeigen?" + }, + { + "English": "Is it safe to walk around here?", + "sceneType": "Travel", + "Chinese (Simplified)": "这里走路安全吗?", + "Spanish": "¿Es seguro caminar aquí?", + "Hindi": "क्या यहाँ चलना सुरक्षित है?", + "Arabic": "هل من الآمن المشي هنا؟", + "Portuguese": "É seguro andar aqui?", + "Bengali": "এখানে হাঁটা কি নিরাপদ?", + "Russian": "Здесь безопасно ходить?", + "Japanese": "ここを歩いても安全ですか?", + "Punjabi": "ਕੀ ਇੱਥੇ ਤੁਰਨਾ ਸੁਰੱਖਿਅਤ ਹੈ?", + "Javanese": "Apa aman kanggo mlaku ing kene?", + "Korean": "여기서 걸어가는 것이 안전한가요?", + "French": "Est-il sécuritaire de marcher ici ?", + "German": "Ist es sicher, hier zu Fuß zu gehen?" + }, + { + "English": "Where is the tourist information center?", + "sceneType": "Travel", + "Chinese (Simplified)": "旅游信息中心在哪里?", + "Spanish": "¿Dónde está el centro de información turística?", + "Hindi": "पर्यटक सूचना केन्द्र कहाँ है?", + "Arabic": "أين يقع مركز المعلومات السياحية؟", + "Portuguese": "Onde fica o centro de informações turísticas?", + "Bengali": "পর্যটন তথ্য কেন্দ্র কোথায়?", + "Russian": "Где находится туристический информационный центр?", + "Japanese": "観光案内所はどこですか?", + "Punjabi": "ਸੈਲਾਨੀ ਸੂਚਨਾ ਕੇਂਦਰ ਕਿੱਥੇ ਹੈ?", + "Javanese": "Ngendi pusat informasi wisata?", + "Korean": "관광안내소는 어디에 있나요?", + "French": "Où se trouve l'office du tourisme ?", + "German": "Wo ist die Touristeninformation?" + }, + { + "English": "Can I get a guidebook?", + "sceneType": "Travel", + "Chinese (Simplified)": "我可以要一本指南吗?", + "Spanish": "¿Puedo tener una guía?", + "Hindi": "क्या मुझे कोई मार्गदर्शक मिल सकता है?", + "Arabic": "هل يمكنني الحصول على دليل؟", + "Portuguese": "Posso ter um guia?", + "Bengali": "আমি একটি গাইড পেতে পারি?", + "Russian": "Можно мне гида?", + "Japanese": "ガイドをお願いできますか?", + "Punjabi": "ਕੀ ਮੈਨੂੰ ਕੋਈ ਗਾਈਡ ਮਿਲ ਸਕਦੀ ਹੈ?", + "Javanese": "Apa aku bisa njaluk panuntun?", + "Korean": "가이드를 받을 수 있나요?", + "French": "Puis-je avoir un guide ?", + "German": "Kann ich einen Führer haben?" + }, + { + "English": "What are the must-see attractions?", + "sceneType": "Travel", + "Chinese (Simplified)": "有什么必看的景点?", + "Spanish": "¿Hay alguna atracción imperdible?", + "Hindi": "क्या यहां कोई अवश्य देखने लायक आकर्षण हैं?", + "Arabic": "هل هناك أي مناطق جذب يجب مشاهدتها؟", + "Portuguese": "Há alguma atração imperdível?", + "Bengali": "কোন দর্শনীয় আকর্ষণ আছে কি?", + "Russian": "Есть ли какие-нибудь достопримечательности, которые обязательно нужно посетить?", + "Japanese": "必見の観光スポットはありますか?", + "Punjabi": "ਕੀ ਇੱਥੇ ਕੋਈ ਦੇਖਣਯੋਗ ਆਕਰਸ਼ਣ ਹਨ?", + "Javanese": "Apa ana atraksi sing kudu dideleng?", + "Korean": "꼭 가봐야 할 명소가 있나요?", + "French": "Y a-t-il des attractions incontournables ?", + "German": "Gibt es Attraktionen, die man gesehen haben muss?" + }, + { + "English": "How much is a taxi to the hotel?", + "sceneType": "Travel", + "Chinese (Simplified)": "打车到酒店多少钱?", + "Spanish": "¿Cuánto cuesta tomar un taxi hasta el hotel?", + "Hindi": "होटल तक टैक्सी लेने में कितना खर्च आता है?", + "Arabic": "كم تكلفة ركوب التاكسي إلى الفندق؟", + "Portuguese": "Quanto custa pegar um táxi até o hotel?", + "Bengali": "হোটেলে ট্যাক্সি নিতে কত খরচ হয়?", + "Russian": "Сколько стоит такси до отеля?", + "Japanese": "ホテルまでタクシーを利用するといくらかかりますか?", + "Punjabi": "ਹੋਟਲ ਤੱਕ ਟੈਕਸੀ ਲੈਣ ਲਈ ਕਿੰਨਾ ਖਰਚਾ ਆਉਂਦਾ ਹੈ?", + "Javanese": "Pira regane njupuk taksi menyang hotel?", + "Korean": "택시를 타고 호텔까지 가는 데 비용이 얼마나 드나요?", + "French": "Combien coûte un taxi jusqu'à l'hôtel ?", + "German": "Wie viel kostet es, mit dem Taxi zum Hotel zu fahren?" + }, + { + "English": "Can I rent a bike here?", + "sceneType": "Travel", + "Chinese (Simplified)": "我可以在这里租自行车吗?", + "Spanish": "¿Puedo alquilar una bicicleta aquí?", + "Hindi": "क्या मैं यहां बाइक किराए पर ले सकता हूं?", + "Arabic": "هل يمكنني استئجار دراجة هنا؟", + "Portuguese": "Posso alugar uma bicicleta aqui?", + "Bengali": "আমি কি এখানে একটি বাইক ভাড়া করতে পারি?", + "Russian": "Могу ли я арендовать здесь велосипед?", + "Japanese": "ここで自転車をレンタルできますか?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਥੇ ਸਾਈਕਲ ਕਿਰਾਏ 'ਤੇ ਲੈ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa nyewa sepeda ing kene?", + "Korean": "여기서 자전거를 빌릴 수 있나요?", + "French": "Puis-je louer un vélo ici ?", + "German": "Kann ich hier ein Fahrrad mieten?" + }, + { + "English": "Is there a good place to eat nearby?", + "sceneType": "Travel", + "Chinese (Simplified)": "附近有好的餐馆吗?", + "Spanish": "¿Hay buenos restaurantes cerca?", + "Hindi": "क्या आस-पास कोई अच्छे रेस्तरां हैं?", + "Arabic": "هل هناك أي مطاعم جيدة قريبة؟", + "Portuguese": "Existem bons restaurantes por perto?", + "Bengali": "কাছাকাছি কোন ভাল রেস্টুরেন্ট আছে?", + "Russian": "Есть ли поблизости хорошие рестораны?", + "Japanese": "近くにおいしいレストランはありますか?", + "Punjabi": "ਕੀ ਨੇੜੇ ਕੋਈ ਵਧੀਆ ਰੈਸਟੋਰੈਂਟ ਹੈ?", + "Javanese": "Apa ana restoran sing apik ing cedhak?", + "Korean": "근처에 좋은 레스토랑이 있나요?", + "French": "Y a-t-il de bons restaurants à proximité ?", + "German": "Gibt es gute Restaurants in der Nähe?" + }, + { + "English": "Where can I exchange currency?", + "sceneType": "Travel", + "Chinese (Simplified)": "我在哪里可以兑换货币?", + "Spanish": "¿Dónde puedo cambiar moneda?", + "Hindi": "मैं मुद्रा का आदान-प्रदान कहाँ कर सकता हूँ?", + "Arabic": "أين يمكنني صرف العملة؟", + "Portuguese": "Onde posso trocar moeda?", + "Bengali": "আমি কোথায় মুদ্রা বিনিময় করতে পারি?", + "Russian": "Где я могу обменять валюту?", + "Japanese": "どこで両替できますか?", + "Punjabi": "ਮੈਂ ਮੁਦਰਾ ਕਿੱਥੇ ਬਦਲ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Ing endi aku bisa ngganti mata uang?", + "Korean": "환전은 어디서 할 수 있나요?", + "French": "Où puis-je échanger des devises ?", + "German": "Wo kann ich Geld umtauschen?" + }, + { + "English": "What is the emergency number?", + "sceneType": "Travel", + "Chinese (Simplified)": "急救电话是多少?", + "Spanish": "¿Cuál es el número de teléfono de emergencia?", + "Hindi": "आपातकालीन टेलीफोन नंबर क्या है?", + "Arabic": "ما هو رقم هاتف الطوارئ؟", + "Portuguese": "Qual é o número de telefone de emergência?", + "Bengali": "জরুরী টেলিফোন নম্বর কি?", + "Russian": "Какой номер телефона экстренной помощи?", + "Japanese": "緊急電話番号とは何ですか?", + "Punjabi": "ਐਮਰਜੈਂਸੀ ਟੈਲੀਫੋਨ ਨੰਬਰ ਕੀ ਹੈ?", + "Javanese": "Apa nomer telpon darurat?", + "Korean": "긴급 전화번호는 무엇입니까?", + "French": "Quel est le numéro de téléphone d’urgence ?", + "German": "Wie lautet die Notrufnummer?" + }, + { + "English": "Can you help me book a tour?", + "sceneType": "Travel", + "Chinese (Simplified)": "你能帮我预订旅行吗?", + "Spanish": "¿Puedes ayudarme a reservar viajes?", + "Hindi": "क्या आप यात्रा बुक करने में मेरी मदद कर सकते हैं?", + "Arabic": "هل يمكنك مساعدتي في حجز السفر؟", + "Portuguese": "Você pode me ajudar a reservar viagens?", + "Bengali": "আপনি কি আমাকে ভ্রমণ বুক করতে সাহায্য করতে পারেন?", + "Russian": "Можете ли вы помочь мне забронировать поездку?", + "Japanese": "旅行の予約を手伝ってもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਯਾਤਰਾ ਬੁੱਕ ਕਰਨ ਵਿੱਚ ਮੇਰੀ ਮਦਦ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa nulungi aku pesen perjalanan?", + "Korean": "여행 예약을 도와주실 수 있나요?", + "French": "Pouvez-vous m'aider à réserver un voyage ?", + "German": "Können Sie mir bei der Reisebuchung helfen?" + }, + { + "English": "Where is the nearest pharmacy?", + "sceneType": "Travel", + "Chinese (Simplified)": "最近的药店在哪里?", + "Spanish": "¿Dónde está la farmacia más cercana?", + "Hindi": "निकटतम दवा की दुकान कहां है?", + "Arabic": "أين تقع أقرب صيدلية؟", + "Portuguese": "Onde fica a farmácia mais próxima?", + "Bengali": "নিকটতম ওষুধের দোকান কোথায়?", + "Russian": "Где здесь ближайшая аптека?", + "Japanese": "最寄りの薬局はどこですか?", + "Punjabi": "ਸਭ ਤੋਂ ਨੇੜ ਦਵਾਈਆਂ ਦੀ ਦੁਕਾਨ ਕਿੱਥੇ ਹੈ?", + "Javanese": "Apotek paling cedhak ngendi?", + "Korean": "가장 가까운 약국은 어디에 있나요?", + "French": "Où est la pharmacie la plus proche?", + "German": "Wo ist die nächste Apotheke?" + }, + { + "English": "Is there free Wi-Fi here?", + "sceneType": "Travel", + "Chinese (Simplified)": "这里有免费Wi-Fi吗?", + "Spanish": "¿Hay Wi-Fi gratis aquí?", + "Hindi": "क्या यहां मुफ़्त वाई-फ़ाई है?", + "Arabic": "هل هناك خدمة الواي فاي المجانية هنا؟", + "Portuguese": "Há Wi-Fi gratuito aqui?", + "Bengali": "এখানে কি ফ্রি ওয়াই-ফাই আছে?", + "Russian": "Здесь есть бесплатный Wi-Fi?", + "Japanese": "ここに無料Wi-Fiはありますか?", + "Punjabi": "ਕੀ ਇੱਥੇ ਮੁਫਤ ਵਾਈ-ਫਾਈ ਹੈ?", + "Javanese": "Apa ana Wi-Fi gratis ing kene?", + "Korean": "여기 무료 Wi-Fi가 있나요?", + "French": "Y a-t-il une connexion Wi-Fi gratuite ici ?", + "German": "Gibt es hier kostenloses WLAN?" + }, + { + "English": "Where is the train station?", + "sceneType": "Travel", + "Chinese (Simplified)": "火车站在哪里?", + "Spanish": "¿Donde esta la estacion de trenes?", + "Hindi": "रेलवे स्टेशन कहां है?", + "Arabic": "أين هو محطة القطار؟", + "Portuguese": "Onde é a estação de trem?", + "Bengali": "ট্রেন স্টেশন কোথায়?", + "Russian": "Где находится вокзал?", + "Japanese": "駅はどこですか?", + "Punjabi": "ਰੇਲਵੇ ਸਟੇਸ਼ਨ ਕਿਥੇ ਹੈ?", + "Javanese": "Stasiun sepur ngendi?", + "Korean": "기차역은 어디에 있나요?", + "French": "Où est la gare?", + "German": "Wo ist der Bahnhof?" + }, + { + "English": "Can you take a picture for me?", + "sceneType": "Travel", + "Chinese (Simplified)": "你能帮我拍张照吗?", + "Spanish": "¿Puedes tomarme una foto?", + "Hindi": "क्या आप मेरे लिए एक फोटो ले सकते हैं?", + "Arabic": "هل يمكنك التقاط صورة لي؟", + "Portuguese": "Você pode tirar uma foto para mim?", + "Bengali": "আপনি কি আমার জন্য একটি ছবি তুলতে পারেন?", + "Russian": "Можешь сфотографировать меня?", + "Japanese": "写真を撮ってもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੇਰੇ ਲਈ ਇੱਕ ਫੋਟੋ ਲੈ ਸਕਦੇ ਹੋ?", + "Javanese": "Sampeyan bisa njupuk foto kanggo kula?", + "Korean": "사진 좀 찍어 주실 수 있나요?", + "French": "Tu peux prendre une photo pour moi ?", + "German": "Kannst du ein Foto für mich machen?" + }, + { + "English": "What time does the museum open?", + "sceneType": "Travel", + "Chinese (Simplified)": "博物馆几点开门?", + "Spanish": "¿A qué hora abre el museo?", + "Hindi": "यह संग्रहालय किस समय खुलता है?", + "Arabic": "ما هو وقت افتتاح المتحف ؟", + "Portuguese": "A que horas o museu abrir?", + "Bengali": "জাদুঘর কখন খোলে?", + "Russian": "Во сколько открывается музей?", + "Japanese": "博物館は何時の開館ですか?", + "Punjabi": "ਅਜਾਇਬ - ਘਰ ਕਿਸ ਸਮੇਂ ਖੁਲਦਾ ਹੈ?", + "Javanese": "Jam pira museum buka?", + "Korean": "박물관은 몇 시에 문을 열나요?", + "French": "A quelle heure ouvre le musée?", + "German": "Um wie viel Uhr wird das Museum öffnen?" + }, + { + "English": "How much does it cost to enter?", + "sceneType": "Travel", + "Chinese (Simplified)": "入场费是多少?", + "Spanish": "¿Cuánto cuesta la entrada?", + "Hindi": "प्रवेश शुल्क कितना है?", + "Arabic": "كم هي رسوم القبول؟", + "Portuguese": "Quanto é a taxa de admissão?", + "Bengali": "ভর্তি ফি কত?", + "Russian": "Сколько стоит входной билет?", + "Japanese": "入場料はいくらですか?", + "Punjabi": "ਦਾਖਲਾ ਫੀਸ ਕਿੰਨੀ ਹੈ?", + "Javanese": "Pira regane?", + "Korean": "입장료는 얼마인가요?", + "French": "Quel est le prix d'entrée ?", + "German": "Wie hoch ist der Eintrittspreis?" + }, + { + "English": "Is there a public restroom nearby?", + "sceneType": "Travel", + "Chinese (Simplified)": "附近有公共厕所吗?", + "Spanish": "¿Hay baños públicos cerca?", + "Hindi": "क्या आसपास सार्वजनिक शौचालय हैं?", + "Arabic": "هل هناك مراحيض عامة قريبة؟", + "Portuguese": "Existem banheiros públicos próximos?", + "Bengali": "কাছাকাছি পাবলিক টয়লেট আছে?", + "Russian": "Есть ли поблизости общественные туалеты?", + "Japanese": "近くに公衆トイレはありますか?", + "Punjabi": "ਕੀ ਨੇੜੇ-ਤੇੜੇ ਜਨਤਕ ਪਖਾਨੇ ਹਨ?", + "Javanese": "Apa ana jamban umum ing cedhak?", + "Korean": "근처에 공중화장실이 있나요?", + "French": "Y a-t-il des toilettes publiques à proximité ?", + "German": "Gibt es öffentliche Toiletten in der Nähe?" + }, + { + "English": "Where can I find a taxi?", + "sceneType": "Travel", + "Chinese (Simplified)": "我在哪里可以找到出租车?", + "Spanish": "¿Dónde puedo encontrar un taxi?", + "Hindi": "मुझे टैक्सी कहाँ मिल सकती है?", + "Arabic": "أين يمكنني أن أجد سيارة أجرة؟", + "Portuguese": "Onde posso encontrar um táxi?", + "Bengali": "আমি কোথা থেকে একটা ট্যাক্সি পেতে পারি?", + "Russian": "Где я могу найти такси?", + "Japanese": "タクシーはどこで見つけられますか?", + "Punjabi": "ਮੈਨੂੰ ਟੈਕਸੀ ਕਿੱਥੇ ਮਿਲ ਸਕਦੀ ਹੈ?", + "Javanese": "Ing endi aku bisa nemokake taksi?", + "Korean": "택시는 어디서 찾을 수 있나요?", + "French": "Où puis-je trouver un taxi?", + "German": "Wo kann ich ein Taxi finden?" + }, + { + "English": "Can I walk there?", + "sceneType": "Travel", + "Chinese (Simplified)": "我可以走到那里吗?", + "Spanish": "¿Puedo caminar hasta allí?", + "Hindi": "क्या मैं वहां चल सकता हूं?", + "Arabic": "هل يمكنني المشي هناك؟", + "Portuguese": "Posso caminhar até lá?", + "Bengali": "আমি কি সেখানে হাঁটতে পারি?", + "Russian": "Могу ли я туда прогуляться?", + "Japanese": "そこまで歩いてもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਉੱਥੇ ਚੱਲ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa mlaku mrana?", + "Korean": "거기까지 걸어갈 수 있나요?", + "French": "Puis-je y aller à pied ?", + "German": "Kann ich dorthin gehen?" + }, + { + "English": "Is this area safe at night?", + "sceneType": "Travel", + "Chinese (Simplified)": "这个区域晚上安全吗?", + "Spanish": "¿Esta zona es segura por la noche?", + "Hindi": "क्या यह क्षेत्र रात में सुरक्षित है?", + "Arabic": "هل هذه المنطقة آمنة في الليل؟", + "Portuguese": "Esta área é segura à noite?", + "Bengali": "এই এলাকা রাতে নিরাপদ?", + "Russian": "Безопасно ли это место ночью?", + "Japanese": "この地域は夜でも安全ですか?", + "Punjabi": "ਕੀ ਇਹ ਖੇਤਰ ਰਾਤ ਨੂੰ ਸੁਰੱਖਿਅਤ ਹੈ?", + "Javanese": "Apa wilayah iki aman ing wayah wengi?", + "Korean": "이 지역은 밤에 안전한가요?", + "French": "Cette zone est-elle sûre la nuit ?", + "German": "Ist dieser Bereich nachts sicher?" + }, + { + "English": "Can I get a city map?", + "sceneType": "Travel", + "Chinese (Simplified)": "我可以要一张城市地图吗?", + "Spanish": "¿Puedo tener un mapa de la ciudad?", + "Hindi": "क्या मेरे पास शहर का नक्शा हो सकता है?", + "Arabic": "هل يمكنني الحصول على خريطة المدينة؟", + "Portuguese": "Posso ter um mapa da cidade?", + "Bengali": "আমি একটি শহরের মানচিত্র পেতে পারি?", + "Russian": "Можно мне карту города?", + "Japanese": "市内地図をもらえますか?", + "Punjabi": "ਕੀ ਮੇਰੇ ਕੋਲ ਸ਼ਹਿਰ ਦਾ ਨਕਸ਼ਾ ਹੈ?", + "Javanese": "Apa aku bisa duwe peta kutha?", + "Korean": "도시 지도를 받을 수 있나요?", + "French": "Puis-je avoir un plan de la ville ?", + "German": "Kann ich einen Stadtplan haben?" + }, + { + "English": "What time is check-out?", + "sceneType": "Travel", + "Chinese (Simplified)": "退房时间是几点?", + "Spanish": "¿A que hora es la salida?", + "Hindi": "चेक-आउट कितने बजे है?", + "Arabic": "ما هو الوقت تحقق من؟", + "Portuguese": "Que horas são check-out?", + "Bengali": "চেক-আউট কি সময়?", + "Russian": "Во сколько выезд?", + "Japanese": "チェックアウトは何時ですか?", + "Punjabi": "ਚੈੱਕ-ਆਊਟ ਕਿੰਨਾ ਸਮਾਂ ਹੁੰਦਾ ਹੈ?", + "Javanese": "Jam pira check-out?", + "Korean": "체크아웃은 몇시입니까?", + "French": "Quelle heure est-il?", + "German": "Wann ist der Check Out?" + }, + { + "English": "Can I store my luggage here?", + "sceneType": "Travel", + "Chinese (Simplified)": "我可以把行李存放在这里吗?", + "Spanish": "¿Puedo guardar mi equipaje aquí?", + "Hindi": "क्या मैं अपना सामान यहाँ रख सकता हूँ?", + "Arabic": "هل يمكنني تخزين أمتعتي هنا؟", + "Portuguese": "Posso guardar minha bagagem aqui?", + "Bengali": "আমি কি এখানে আমার লাগেজ সংরক্ষণ করতে পারি?", + "Russian": "Могу ли я оставить здесь свой багаж?", + "Japanese": "ここに荷物を預けることはできますか?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਥੇ ਆਪਣਾ ਸਮਾਨ ਰੱਖ ਸਕਦਾ ਹਾਂ?", + "Korean": "여기에 짐을 보관할 수 있나요?", + "French": "Puis-je entreposer mes bagages ici ?", + "German": "Kann ich mein Gepäck hier aufbewahren?" + }, + { + "English": "Where can I buy souvenirs?", + "sceneType": "Travel", + "Chinese (Simplified)": "我在哪里可以买纪念品?", + "Spanish": "¿Dónde puedo comprar souvenirs?", + "Hindi": "मैं स्मृति चिन्ह कहाँ से खरीद सकता हूँ?", + "Arabic": "أين يمكنني شراء الهدايا التذكارية؟", + "Portuguese": "Onde posso comprar lembranças?", + "Bengali": "কোথায় আমি স্যুভেনির কিনতে পারি?", + "Russian": "Где я могу купить сувениры?", + "Japanese": "お土産はどこで買えますか?", + "Punjabi": "ਮੈਂ ਯਾਦਗਾਰੀ ਕਿੱਥੋਂ ਖਰੀਦ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Ing endi bisa tuku souvenir?", + "Korean": "기념품은 어디서 살 수 있나요?", + "French": "Où puis-je acheter des souvenirs ?", + "German": "Wo kann ich Souvenirs kaufen?" + }, + { + "English": "How far is it to the beach?", + "sceneType": "Travel", + "Chinese (Simplified)": "到海滩有多远?", + "Spanish": "¿A qué distancia está la playa?", + "Hindi": "यह समुद्र तट से कितनी दूर है?", + "Arabic": "كم يبعد عن الشاطئ؟", + "Portuguese": "A que distância fica a praia?", + "Bengali": "সৈকত থেকে কত দূরে?", + "Russian": "Как далеко до пляжа?", + "Japanese": "ビーチまではどのくらいの距離ですか?", + "Punjabi": "ਇਹ ਬੀਚ ਤੱਕ ਕਿੰਨੀ ਦੂਰ ਹੈ?", + "Javanese": "Sepira adohe menyang pantai?", + "Korean": "해변까지 얼마나 멉니까?", + "French": "Jusqu'où est la plage ?", + "German": "Wie weit ist es bis zum Strand?" + }, + { + "English": "Can I book tickets online?", + "sceneType": "Travel", + "Chinese (Simplified)": "我可以在线订票吗?", + "Spanish": "¿Puedo reservar entradas en línea?", + "Hindi": "क्या मैं ऑनलाइन टिकट बुक कर सकता हूँ?", + "Arabic": "هل يمكنني حجز التذاكر عبر الإنترنت؟", + "Portuguese": "Posso reservar ingressos online?", + "Bengali": "আমি কি অনলাইনে টিকিট বুক করতে পারি?", + "Russian": "Могу ли я забронировать билеты онлайн?", + "Japanese": "チケットをオンラインで予約できますか?", + "Punjabi": "ਕੀ ਮੈਂ ਔਨਲਾਈਨ ਟਿਕਟਾਂ ਬੁੱਕ ਕਰ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Bisa Book tiket online?", + "Korean": "온라인으로 티켓을 예약할 수 있나요?", + "French": "Puis-je réserver des billets en ligne ?", + "German": "Kann ich Tickets online buchen?" + }, + { + "English": "What time does the last train leave?", + "sceneType": "Travel", + "Chinese (Simplified)": "最后一班火车几点开?", + "Spanish": "¿A qué hora sale el último tren?", + "Hindi": "आखिरी ट्रेन कितने बजे छूटती है?", + "Arabic": "في أي وقت يغادر القطار الأخير؟", + "Portuguese": "A que horas sai o último trem?", + "Bengali": "শেষ ট্রেন কখন ছাড়ে?", + "Russian": "Во сколько уходит последний поезд?", + "Japanese": "最終電車は何時に出発しますか?", + "Punjabi": "ਆਖਰੀ ਰੇਲਗੱਡੀ ਕਿੰਨੇ ਵਜੇ ਰਵਾਨਾ ਹੁੰਦੀ ਹੈ?", + "Javanese": "Jam pira sepur pungkasan mangkat?", + "Korean": "마지막 열차는 몇시에 출발하나요?", + "French": "À quelle heure part le dernier train ?", + "German": "Wann fährt der letzte Zug ab?" + }, + { + "English": "Where can I find a supermarket?", + "sceneType": "Travel", + "Chinese (Simplified)": "我在哪里可以找到超市?", + "Spanish": "¿Dónde puedo encontrar un supermercado?", + "Hindi": "मुझे सुपरमार्केट कहां मिल सकता है?", + "Arabic": "أين يمكنني العثور على السوبر ماركت؟", + "Portuguese": "Onde posso encontrar um supermercado?", + "Bengali": "আমি একটি সুপারমার্কেট কোথায় পেতে পারি?", + "Russian": "Где я могу найти супермаркет?", + "Japanese": "スーパーマーケットはどこにありますか?", + "Punjabi": "ਮੈਨੂੰ ਇੱਕ ਸੁਪਰਮਾਰਕੀਟ ਕਿੱਥੇ ਮਿਲ ਸਕਦਾ ਹੈ?", + "Javanese": "Ing endi aku bisa nemokake supermarket?", + "Korean": "슈퍼마켓은 어디에서 찾을 수 있나요?", + "French": "Où puis-je trouver un supermarché?", + "German": "Wo finde ich einen Supermarkt?" + }, + { + "English": "Do I need a visa?", + "sceneType": "Travel", + "Chinese (Simplified)": "我需要签证吗?", + "Spanish": "¿Necesito una visa?", + "Hindi": "क्या मुझे वीज़ा की आवश्यकता है?", + "Arabic": "هل أحتاج إلى تأشيرة؟", + "Portuguese": "Eu preciso de um visto?", + "Bengali": "আমার কি ভিসা লাগবে?", + "Russian": "Нужна ли мне виза?", + "Japanese": "ビザは必要ですか?", + "Punjabi": "ਕੀ ਮੈਨੂੰ ਵੀਜ਼ਾ ਚਾਹੀਦਾ ਹੈ?", + "Javanese": "Apa aku kudu visa?", + "Korean": "비자가 필요합니까?", + "French": "Ai-je besoin d'un visa ?", + "German": "Brauche ich ein Visum?" + }, + { + "English": "What is the best time to visit?", + "sceneType": "Travel", + "Chinese (Simplified)": "什么时候是旅游的最佳时间?", + "Spanish": "¿Cuándo es la mejor época para viajar?", + "Hindi": "यात्रा करने का सबसे अच्छा समय कब है?", + "Arabic": "ما هو أفضل وقت للسفر؟", + "Portuguese": "Qual é a melhor época para viajar?", + "Bengali": "ভ্রমণের সেরা সময় কখন?", + "Russian": "Когда лучше всего путешествовать?", + "Japanese": "旅行に最適な時期はいつですか?", + "Punjabi": "ਯਾਤਰਾ ਕਰਨ ਦਾ ਸਭ ਤੋਂ ਵਧੀਆ ਸਮਾਂ ਕਦੋਂ ਹੈ?", + "Javanese": "Nalika wektu paling apik kanggo lelungan?", + "Korean": "여행하기 가장 좋은 시기는 언제인가요?", + "French": "Quelle est la meilleure période pour voyager ?", + "German": "Wann ist die beste Reisezeit?" + }, + { + "English": "Can I get a taxi from here?", + "sceneType": "Travel", + "Chinese (Simplified)": "我可以从这里打车吗?", + "Spanish": "¿Puedo tomar un taxi desde aquí?", + "Hindi": "क्या मैं यहाँ से टैक्सी ले सकता हूँ?", + "Arabic": "هل يمكنني أخذ سيارة أجرة من هنا؟", + "Portuguese": "Posso pegar um táxi daqui?", + "Bengali": "আমি কি এখান থেকে ট্যাক্সি নিতে পারি?", + "Russian": "Могу ли я взять такси отсюда?", + "Japanese": "ここからタクシーに乗ってもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਥੋਂ ਟੈਕਸੀ ਲੈ ਸਕਦਾ\/ਸਕਦੀ ਹਾਂ?", + "Javanese": "Apa aku bisa numpak taksi saka kene?", + "Korean": "여기서 택시를 탈 수 있나요?", + "French": "Puis-je prendre un taxi à partir d'ici ?", + "German": "Kann ich von hier aus ein Taxi nehmen?" + }, + { + "English": "How do I get to the city center?", + "sceneType": "Travel", + "Chinese (Simplified)": "我怎么去市中心?", + "Spanish": "¿Cómo llego al centro de la ciudad?", + "Hindi": "मैं शहर के केंद्र तक कैसे पहुँचूँ?", + "Arabic": "كيف أصل إلى وسط المدينة؟", + "Portuguese": "Como chego ao centro da cidade?", + "Bengali": "আমি কিভাবে শহরের কেন্দ্রে যেতে পারি?", + "Russian": "Как мне добраться до центра города?", + "Japanese": "市内中心部へはどうやって行けますか?", + "Punjabi": "ਮੈਂ ਸ਼ਹਿਰ ਦੇ ਕੇਂਦਰ ਤੱਕ ਕਿਵੇਂ ਪਹੁੰਚਾਂ?", + "Javanese": "Kepiye carane aku menyang pusat kutha?", + "Korean": "시내 중심가까지는 어떻게 가나요?", + "French": "Comment puis-je me rendre au centre-ville ?", + "German": "Wie komme ich in die Innenstadt?" + }, + { + "English": "Is there a hospital nearby?", + "sceneType": "Travel", + "Chinese (Simplified)": "附近有医院吗?", + "Spanish": "¿Hay algún hospital cerca?", + "Hindi": "क्या आस-पास कोई अस्पताल है?", + "Arabic": "هل يوجد مستشفى قريب؟", + "Portuguese": "Existe um hospital próximo?", + "Bengali": "কাছাকাছি কোন হাসপাতাল আছে?", + "Russian": "Есть ли поблизости больница?", + "Japanese": "近くに病院はありますか?", + "Punjabi": "ਕੀ ਨੇੜੇ ਕੋਈ ਹਸਪਤਾਲ ਹੈ?", + "Javanese": "Apa ana rumah sakit cedhak?", + "Korean": "근처에 병원이 있나요?", + "French": "Y a-t-il un hôpital à proximité ?", + "German": "Gibt es ein Krankenhaus in der Nähe?" + }, + { + "English": "Can you recommend a good hotel?", + "sceneType": "Travel", + "Chinese (Simplified)": "你能推荐一家好酒店吗?", + "Spanish": "¿Puedes recomendar un buen hotel?", + "Hindi": "क्या आप कोई अच्छा होटल सुझा सकते हैं?", + "Arabic": "هل يمكنك أن توصي بفندق جيد؟", + "Portuguese": "Você pode recomendar um bom hotel?", + "Bengali": "আপনি একটি ভাল হোটেল সুপারিশ করতে পারেন?", + "Russian": "Можете ли вы порекомендовать хороший отель?", + "Japanese": "良いホテルを紹介してもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਇੱਕ ਚੰਗੇ ਹੋਟਲ ਦੀ ਸਿਫ਼ਾਰਿਸ਼ ਕਰ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa menehi rekomendasi hotel sing apik?", + "Korean": "좋은 호텔을 추천해주실 수 있나요?", + "French": "Pouvez-vous recommander un bon hôtel ?", + "German": "Können Sie ein gutes Hotel empfehlen?" + }, + { + "English": "Where is the nearest ATM?", + "sceneType": "Travel", + "Chinese (Simplified)": "最近的自动取款机在哪里?", + "Spanish": "¿Dónde está el cajero automático más cercano?", + "Hindi": "निकटतम एटीएम कहाँ है?", + "Arabic": "أين يقع أقرب جهاز صراف آلي؟", + "Portuguese": "Onde fica o caixa eletrônico mais próximo?", + "Bengali": "নিকটতম এটিএম কোথায়?", + "Russian": "Где ближайший банкомат?", + "Japanese": "最寄りのATMはどこですか?", + "Punjabi": "ਸਭ ਤੋਂ ਨੇੜਲਾ ATM ਕਿੱਥੇ ਹੈ?", + "Javanese": "Ing endi ATM paling cedhak?", + "Korean": "가장 가까운 ATM은 어디에 있나요?", + "French": "Où se trouve le guichet automatique le plus proche ?", + "German": "Wo ist der nächste Geldautomat?" + }, + { + "English": "Can I buy a metro pass here?", + "sceneType": "Travel", + "Chinese (Simplified)": "我可以在这里买地铁通票吗?", + "Spanish": "¿Puedo comprar un pase de metro aquí?", + "Hindi": "क्या मैं यहां मेट्रो पास खरीद सकता हूं?", + "Arabic": "هل يمكنني شراء بطاقة مترو هنا؟", + "Portuguese": "Posso comprar um passe de metrô aqui?", + "Bengali": "আমি কি এখানে একটি মেট্রো পাস কিনতে পারি?", + "Russian": "Могу ли я купить здесь проездной на метро?", + "Japanese": "ここでメトロパスを購入できますか?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਥੇ ਮੈਟਰੋ ਪਾਸ ਖਰੀਦ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa tuku pass metro ing kene?", + "Korean": "여기서 지하철 패스를 살 수 있나요?", + "French": "Puis-je acheter un pass de métro ici ?", + "German": "Kann ich hier ein U-Bahn-Ticket kaufen?" + }, + { + "English": "What is the local cuisine?", + "sceneType": "Travel", + "Chinese (Simplified)": "当地美食是什么?", + "Spanish": "¿Cuál es la cocina local?", + "Hindi": "स्थानीय व्यंजन क्या है?", + "Arabic": "ما هو المطبخ المحلي؟", + "Portuguese": "Qual é a culinária local?", + "Bengali": "স্থানীয় রন্ধনপ্রণালী কি?", + "Russian": "Что такое местная кухня?", + "Japanese": "郷土料理とは何ですか?", + "Punjabi": "ਸਥਾਨਕ ਪਕਵਾਨ ਕੀ ਹੈ?", + "Javanese": "Apa masakan lokal?", + "Korean": "향토요리는 무엇인가요?", + "French": "Quelle est la cuisine locale ?", + "German": "Was ist die lokale Küche?" + }, + { + "English": "Can I get a travel insurance?", + "sceneType": "Travel", + "Chinese (Simplified)": "我可以买旅游保险吗?", + "Spanish": "¿Puedo comprar un seguro de viaje?", + "Hindi": "क्या मैं यात्रा बीमा खरीद सकता हूँ?", + "Arabic": "هل يمكنني شراء تأمين السفر؟", + "Portuguese": "Posso comprar um seguro de viagem?", + "Bengali": "আমি কি ভ্রমণ বীমা কিনতে পারি?", + "Russian": "Могу ли я купить туристическую страховку?", + "Japanese": "旅行保険に加入できますか?", + "Punjabi": "ਕੀ ਮੈਂ ਯਾਤਰਾ ਬੀਮਾ ਖਰੀਦ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa tuku asuransi perjalanan?", + "Korean": "여행 보험에 가입할 수 있나요?", + "French": "Puis-je souscrire une assurance voyage ?", + "German": "Kann ich eine Reiseversicherung abschließen?" + } + ] + }, + { + "sceneSource": "Making friends", + "sceneType": "Making friends", + "sceneList": [ + { + "English": "Let's hang out", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们出去玩吧", + "Spanish": "salgamos a jugar", + "Hindi": "चलो बाहर चलें और खेलें", + "Arabic": "دعونا نخرج ونلعب", + "Portuguese": "vamos sair e brincar", + "Bengali": "চল বাইরে গিয়ে খেলি", + "Russian": "давай выйдем и поиграем", + "Japanese": "外に出て遊びましょう", + "Punjabi": "ਚਲੋ ਬਾਹਰ ਚੱਲੀਏ ਅਤੇ ਖੇਡੀਏ", + "Javanese": "ayo metu lan dolanan", + "Korean": "나가서 놀자", + "French": "sortons et jouons", + "German": "Lass uns rausgehen und spielen" + }, + { + "English": "What's your favorite hobby?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的爱好是什么?", + "Spanish": "¿Cuál es tu pasatiempo favorito?", + "Hindi": "आपका पसंदीदा शौक क्या है?", + "Arabic": "ما هى هوايتك المفضلة؟", + "Portuguese": "Qual é o seu hobby favorito?", + "Bengali": "আপনার প্রিয় শখ কি?", + "Russian": "Какое твое любимое хобби?", + "Japanese": "あなたの一番好きな趣味は何ですか?", + "Punjabi": "ਤੁਹਾਡਾ ਮਨਪਸੰਦ ਸ਼ੌਕ ਕੀ ਹੈ?", + "Javanese": "Apa hobi favoritmu?", + "Korean": "너의 가장 좋아하는 취미가 뭐니?", + "French": "Quel est votre passe-temps favori?", + "German": "Was ist dein Lieblingshobby?" + }, + { + "English": "Let's go to a movie", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们去看电影吧", + "Spanish": "vamos al cine", + "Hindi": "चलो फ़िल्म देखने चलें", + "Arabic": "لنذهب إلى السينما", + "Portuguese": "vamos ao cinema", + "Bengali": "চল সিনেমা দেখতে যাই", + "Russian": "пойдем в кино", + "Japanese": "映画に行こう", + "Punjabi": "ਚਲੋ ਫਿਲਮਾਂ ਵਿੱਚ ਚੱਲੀਏ", + "Javanese": "ayo padha nonton wayang", + "Korean": "영화 보러 가자", + "French": "Allons au cinéma", + "German": "lass uns ins Kino gehen" + }, + { + "English": "Do you want to come to my party?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你想来我的派对吗?", + "Spanish": "¿Quieres venir a mi fiesta?", + "Hindi": "क्या आप मेरी पार्टी में आना चाहते हैं?", + "Arabic": "هل تريد أن تأتي إلى حفلتي؟", + "Portuguese": "Você quer vir à minha festa?", + "Bengali": "তুমি কি আমার পার্টিতে আসতে চাও?", + "Russian": "Хочешь прийти на мою вечеринку?", + "Japanese": "私のパーティーに来ませんか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੇਰੀ ਪਾਰਟੀ ਵਿੱਚ ਆਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?", + "Javanese": "Apa sampeyan pengin teka ing pestaku?", + "Korean": "내 파티에 올래?", + "French": "Veux-tu venir à ma fête ?", + "German": "Willst du zu meiner Party kommen?" + }, + { + "English": "We should do this again", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们应该再这样做", + "Spanish": "deberíamos hacer esto de nuevo", + "Hindi": "हमें यह दोबारा करना चाहिए", + "Arabic": "يجب أن نفعل هذا مرة أخرى", + "Portuguese": "deveríamos fazer isso de novo", + "Bengali": "আমাদের এটা আবার করা উচিত", + "Russian": "нам следует сделать это снова", + "Japanese": "これをもう一度やるべきです", + "Punjabi": "ਸਾਨੂੰ ਇਹ ਦੁਬਾਰਾ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ", + "Javanese": "kita kudu nindakake iki maneh", + "Korean": "우리 이걸 또 해야 해", + "French": "nous devrions refaire ça", + "German": "wir sollten das noch einmal machen" + }, + { + "English": "What's your favorite book?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的书是什么?", + "Spanish": "¿Cuál es su libro favorito?", + "Hindi": "आपकी पसंदीदा पुस्तक कौन सी है?", + "Arabic": "ماهو كتابك المفضل؟", + "Portuguese": "Qual é o seu livro favorito?", + "Bengali": "আপনার প্রিয় বই কি?", + "Russian": "Какая твоя любимая книга?", + "Japanese": "あなたの好きな本は何ですか?", + "Punjabi": "ਤੁਹਾਡੀ ਮਨਪਸੰਦ ਕਿਤਾਬ ਕਿਹੜੀ ਹੈ?", + "Javanese": "Apa buku favoritmu?", + "Korean": "좋아하는 책은 무엇인가?", + "French": "Quel est ton livre préféré?", + "German": "Was ist dein Lieblingsbuch?" + }, + { + "English": "Do you like to travel?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你喜欢旅游吗?", + "Spanish": "¿Te gusta viajar?", + "Hindi": "क्या आप यात्रा करना पसंद करते हैं?", + "Arabic": "أتحب الترحال؟", + "Portuguese": "Você gosta de viajar?", + "Bengali": "তুমি কি ভ্রমণ করতে পছন্দ কর?", + "Russian": "Тебе нравится путешествовать?", + "Japanese": "旅行がすきですか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਯਾਤਰਾ ਕਰਨਾ ਪਸੰਦ ਕਰਦੇ ਹੋ?", + "Javanese": "Apa sampeyan seneng lelungan?", + "Korean": "여행을 좋아하시나요?", + "French": "Aimes-tu voyager?", + "German": "Reisen Sie gerne?" + }, + { + "English": "Let's play a game", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们玩个游戏吧", + "Spanish": "Vamos a jugar un juego", + "Hindi": "चलो एक खेल खेलते हैं", + "Arabic": "دعونا نلعب لعبة", + "Portuguese": "Vamos jogar um jogo", + "Bengali": "চল একটা খেলা খেলি", + "Russian": "Давай сыграем в игру", + "Japanese": "ゲームをしましょう", + "Punjabi": "ਆਓ ਇੱਕ ਖੇਡ ਖੇਡੀਏ", + "Javanese": "Ayo dolanan", + "Korean": "게임하자", + "French": "Jouons à un jeu", + "German": "Lassen Sie uns ein Spiel spielen" + }, + { + "English": "Can I have your phone number?", + "sceneType": "Making friends", + "Chinese (Simplified)": "我可以要你的电话号码吗?", + "Spanish": "¿Puedo tener tu número de teléfono?", + "Hindi": "क्या मुझे आपका फोन नम्बर मिल सकता है?", + "Arabic": "هل يمكنني الحصول على رقم هاتفك؟", + "Portuguese": "Posso ter o número do seu telefone?", + "Bengali": "আমি কি আপনার ফোন নম্বর পেতে পারি?", + "Russian": "Могу я взять твой номер телефона?", + "Japanese": "電話番号を教えていただけますか?", + "Punjabi": "ਕੀ ਮੈਨੂੰ ਤੁਹਾਡਾ ਫ਼ੋਨ ਨੰਬਰ ਮਿਲ ਸਕਦਾ ਹੈ?", + "Javanese": "Bisa njaluk nomer telpon?", + "Korean": "전화 번호를 가르쳐 주시면 안되나요?", + "French": "Puis-je avoir votre numéro de téléphone?", + "German": "Kann ich deine Handynummer haben?" + }, + { + "English": "Do you want to grab a coffee?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你想去喝咖啡吗?", + "Spanish": "¿Quieres ir a tomar un café?", + "Hindi": "क्या आप कॉफ़ी लेने जाना चाहते हैं?", + "Arabic": "هل تريد الذهاب لإحضار القهوة؟", + "Portuguese": "Você quer ir tomar um café?", + "Bengali": "তুমি কি কফি খেতে যেতে চাও?", + "Russian": "Хочешь пойти выпить кофе?", + "Japanese": "コーヒーを飲みに行きませんか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਕੌਫੀ ਲੈਣ ਜਾਣਾ ਚਾਹੁੰਦੇ ਹੋ?", + "Javanese": "Apa kowe arep golek kopi?", + "Korean": "커피 마시러 갈래?", + "French": "Tu veux aller prendre un café ?", + "German": "Willst du Kaffee holen gehen?" + }, + { + "English": "What's your favorite movie?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的电影是什么?", + "Spanish": "¿Cuál es tu película favorita?", + "Hindi": "आपकी पसंदीदा फिल्म कौनसी है?", + "Arabic": "ما هو فيلمك المفضل؟", + "Portuguese": "Qual seu filme favorito?", + "Bengali": "আপনার প্রিয় সিনেমা কি?", + "Russian": "Какой твой любимый фильм?", + "Japanese": "好きな映画は何ですか?", + "Punjabi": "ਤੁਹਾਡੀ ਮਨਪਸੰਦ ਫ਼ਿਲਮ ਕਿਹੜੀ ਹੈ?", + "Javanese": "Apa film favorit sampeyan?", + "Korean": "네가 가장 좋아하는 영화가 뭐니?", + "French": "Quel est votre film préféré?", + "German": "Was ist dein Lieblingsfilm?" + }, + { + "English": "Let's go for a walk", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们去散步吧", + "Spanish": "vamos a caminar", + "Hindi": "आओ सैर पर चलते हैं", + "Arabic": "لنتمشى", + "Portuguese": "vamos dar um passeio", + "Bengali": "চল হাটতে যাই", + "Russian": "давай прогуляемся", + "Japanese": "散歩に行きましょう", + "Punjabi": "ਚਲੋ ਸੈਰ ਲਈ ਚੱਲੀਏ", + "Javanese": "ayo mlaku-mlaku", + "Korean": "산책하러 가자", + "French": "allons nous promener", + "German": "Lass uns spazieren gehen" + }, + { + "English": "Do you want to join us?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你想加入我们吗?", + "Spanish": "¿Quieres unirte a nosotros?", + "Hindi": "क्या आप हमारे साथ शामिल होना चाहते हैं?", + "Arabic": "هل ترغب في الإنضمام إلينا؟", + "Portuguese": "Você quer se juntar a nos?", + "Bengali": "আপনি আমাদের সঙ্গে যোগদান করতে চান?", + "Russian": "Вы хотите к нам присоединиться?", + "Japanese": "参加したいですか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਸਾਡੇ ਨਾਲ ਜੁੜਨਾ ਚਾਹੁੰਦੇ ਹੋ?", + "Javanese": "Apa sampeyan pengin melu kita?", + "Korean": "우리와 함께하고 싶나요?", + "French": "Voulez-vous vous joindre à nous?", + "German": "Möchtest du uns beitreten?" + }, + { + "English": "What kind of music do you like?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你喜欢什么类型的音乐?", + "Spanish": "¿Que tipo de música te gusta?", + "Hindi": "किस तरह का संगीत आप पसंद करते है?", + "Arabic": "ما نوع المسيقى التي تفضل؟", + "Portuguese": "Que tipo de música você gosta?", + "Bengali": "আপনি কোন ধরনের গান পছন্দ করেন?", + "Russian": "Какой жанр музыки ты предпочитаешь?", + "Japanese": "あなたはどんな音楽が好きですか?", + "Punjabi": "ਤੁਹਾਨੂੰ ਕਿਸ ਕਿਸਮ ਦਾ ਸੰਗੀਤ ਪਸੰਦ ਹੈ?", + "Javanese": "Apa jinis musik sing sampeyan senengi?", + "Korean": "너는 무슨 종류의 음악을 좋아하니?", + "French": "Quel type de musique aimez-vous?", + "German": "Welche Art von Musik magst du?" + }, + { + "English": "Let's have lunch together", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们一起吃午饭吧", + "Spanish": "Comamos juntos", + "Hindi": "चलो साथ में लंच करते हैं", + "Arabic": "هيا نتغدي معا", + "Portuguese": "vamos almoçar juntos", + "Bengali": "আসুন একসাথে লাঞ্চ করি", + "Russian": "давай пообедаем вместе", + "Japanese": "一緒にランチを食べましょう", + "Punjabi": "ਆਓ ਇਕੱਠੇ ਦੁਪਹਿਰ ਦਾ ਖਾਣਾ ਕਰੀਏ", + "Javanese": "ayo mangan bareng", + "Korean": "같이 점심 먹자", + "French": "déjeunons ensemble", + "German": "Lass uns zusammen zu Mittag essen" + }, + { + "English": "Do you like sports?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你喜欢运动吗?", + "Spanish": "¿Te gustan los deportes?", + "Hindi": "क्या आपको खेल पसंद है?", + "Arabic": "هل تحب الرياضة؟", + "Portuguese": "você gosta de esportes?", + "Bengali": "তুমি কি খেলাধুলা পছন্দ কর?", + "Russian": "вы любите спорт?", + "Japanese": "スポーツが好きですか?", + "Punjabi": "ਕੀ ਤੁਹਾਨੂੰ ਖੇਡਾਂ ਪਸੰਦ ਹਨ?", + "Javanese": "sampeyan seneng olahraga?", + "Korean": "당신은 스포츠를 좋아합니까?", + "French": "aimes tu le sport?", + "German": "Magst du Sport?" + }, + { + "English": "What's your favorite sport?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的运动是什么?", + "Spanish": "¿Cuál es su deporte favorito?", + "Hindi": "आपका पसंदीदा खेल क्या है?", + "Arabic": "ما هي رياضتك المفضلة؟", + "Portuguese": "Qual é seu esporte favorito?", + "Bengali": "আপনার প্রিয় খেলাধুলা কি?", + "Russian": "какой твой любимый вид спорта?", + "Japanese": "あなたの好きなスポーツは何ですか?", + "Punjabi": "ਤੁਹਾਡੀ ਮਨਪਸੰਦ ਖੇਡ ਕੀ ਹੈ?", + "Javanese": "apa olahraga favorit sampeyan?", + "Korean": "좋아하는 스포츠는 무엇인가?", + "French": "quel est ton sport préféré?", + "German": "Was ist dein Lieblingssport?" + }, + { + "English": "Let's go shopping", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们去购物吧", + "Spanish": "vamos de compras", + "Hindi": "चलो शॉपिंग चलते हैं", + "Arabic": "لنذهب للتسوق", + "Portuguese": "Vamos fazer compras", + "Bengali": "চল কেনাকাটা করতে যাই", + "Russian": "пойдем по магазинам", + "Japanese": "買い物に行きましょう", + "Punjabi": "ਚਲੋ ਖਰੀਦਦਾਰੀ ਕਰੀਏ", + "Javanese": "ayo blanja", + "Korean": "쇼핑하러 가자", + "French": "allons faire du shopping", + "German": "gehen wir einkaufen" + }, + { + "English": "Do you have any pets?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你有宠物吗?", + "Spanish": "¿Tiene mascotas?", + "Hindi": "क्या आपके पास कोई पालतु पशु है?", + "Arabic": "هل لديك أي حيوانات أليفة؟", + "Portuguese": "você tem algum animal de estimação?", + "Bengali": "তোমার কি কোন পোষা প্রাণী আছে?", + "Russian": "Есть ли у вас домашние животные?", + "Japanese": "ペットを飼っていますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਪਾਲਤੂ ਜਾਨਵਰ ਹੈ?", + "Javanese": "Apa sampeyan duwe pets?", + "Korean": "당신은 어떤 애완 동물을해야합니까?", + "French": "Avez-vous des animaux domestiques?", + "German": "Haben Sie Haustiere?" + }, + { + "English": "What's your favorite food?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的食物是什么?", + "Spanish": "¿Cuál es tu comida favorita?", + "Hindi": "आपका पसंदीदा भोजन क्या है?", + "Arabic": "ما هو طعامك المفضل؟", + "Portuguese": "Qual sua comida favorita?", + "Bengali": "আপনার প্রিয় খাদ্য কি?", + "Russian": "Какая ваша любимая еда?", + "Japanese": "あなたの好きな食べ物は何ですか?", + "Punjabi": "ਤੁਹਾਡਾ ਮਨਪਸੰਦ ਭੋਜਨ ਕੀ ਹੈ?", + "Javanese": "Apa panganan favoritmu?", + "Korean": "가장 좋아하는 음식 무엇?", + "French": "Quel est ton plat préféré?", + "German": "Was ist dein Lieblingsessen?" + }, + { + "English": "Let's study together", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们一起学习吧", + "Spanish": "Vamos a estudiar juntos", + "Hindi": "आइए मिलकर पढ़ाई करें", + "Arabic": "دعونا ندرس معا", + "Portuguese": "Vamos estudar juntos", + "Bengali": "আসুন একসাথে পড়াশুনা করি", + "Russian": "Давайте учиться вместе", + "Japanese": "一緒に勉強しましょう", + "Punjabi": "ਆਉ ਇਕੱਠੇ ਅਧਿਐਨ ਕਰੀਏ", + "Javanese": "Ayo sinau bareng", + "Korean": "같이 공부하자", + "French": "Étudions ensemble", + "German": "Lass uns zusammen lernen" + }, + { + "English": "Do you like to read?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你喜欢读书吗?", + "Spanish": "¿Te gusta leer?", + "Hindi": "क्या आपको पढ़ना पसन्द है?", + "Arabic": "هل تحب القراءة؟", + "Portuguese": "Você gosta de ler?", + "Bengali": "তুমি কি পরতে ভালবাস?", + "Russian": "Вы любите читать?", + "Japanese": "読書は好きですか?", + "Punjabi": "ਕੀ ਤੁਹਾਨੂੰ ਪੜ੍ਹਨਾ ਪਸੰਦ ਹੈ?", + "Javanese": "Apa sampeyan seneng maca?", + "Korean": "책 읽는 거 좋아하니?", + "French": "Aimes-tu lire?", + "German": "Magst du lesen?" + }, + { + "English": "What's your favorite color?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的颜色是什么?", + "Spanish": "¿Cuál es tu color favorito?", + "Hindi": "आपका पसंदीदा रंग क्या है?", + "Arabic": "ما هو لونك المفضل؟", + "Portuguese": "Qual é a sua cor favorita?", + "Bengali": "আপনার প্রিয় রং কি?", + "Russian": "Какой ваш любимый цвет?", + "Japanese": "あなたの好きな色は何ですか?", + "Punjabi": "ਤੁਹਾਡਾ ਮਨਪਸੰਦ ਰੰਗ ਕਿਹੜਾ ਹੈ?", + "Javanese": "Apa warna favoritmu?", + "Korean": "좋아하는 색깔 무엇?", + "French": "Quelle est ta couleur préférée?", + "German": "Was ist deine Lieblingsfarbe?" + }, + { + "English": "Let's go to the beach", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们去海滩吧", + "Spanish": "vamos a la playa", + "Hindi": "चलो समुद्र तट पर चलते हैं", + "Arabic": "هيا لنذهب إلى الشاطئ", + "Portuguese": "vamos à praia", + "Bengali": "চল বিচে যাই", + "Russian": "пойдем на пляж", + "Japanese": "海へ行きましょう", + "Punjabi": "ਚਲੋ ਬੀਚ 'ਤੇ ਚੱਲੀਏ", + "Javanese": "ayo menyang pantai", + "Korean": "해변으로 가자", + "French": "Allons à la plage", + "German": "lass uns zum Strand gehen" + }, + { + "English": "Do you play any instruments?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你会演奏乐器吗?", + "Spanish": "¿Puedes tocar un instrumento?", + "Hindi": "क्या आप एक साधन बजा सकते हैं?", + "Arabic": "هل يمكنك العزف على آلة موسيقية؟", + "Portuguese": "Voce pode tocar um instrumento?", + "Bengali": "তুমি কি কোনো বাদ্যযন্ত্র বাজাতে পারো?", + "Russian": "Вы можете играть на инструменте?", + "Japanese": "楽器を演奏できますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਕੋਈ ਸਾਜ਼ ਵਜਾ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa muter instrumen?", + "Korean": "악기를 연주할 수 있나요?", + "French": "Pouvez-vous jouer d'un instrument?", + "German": "Kannst du ein Instrument spielen?" + }, + { + "English": "What's your favorite TV show?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的电视节目是什么?", + "Spanish": "¿Cuál es tu programa de televisión favorito?", + "Hindi": "आपका पसंदीदा टीवी कार्यक्रम क्या है?", + "Arabic": "ما هو برنامجك التلفزيوني المفضل؟", + "Portuguese": "Qual é o seu programa de TV favorito?", + "Bengali": "আপনার প্রিয় টিভি শো কি?", + "Russian": "Какое твое любимое ТВ шоу?", + "Japanese": "あなたの好きなテレビ番組は何ですか?", + "Punjabi": "ਤੁਹਾਡਾ ਮਨਪਸੰਦ ਟੀਵੀ ਸ਼ੋਅ ਕੀ ਹੈ?", + "Javanese": "Apa acara TV favoritmu?", + "Korean": "당신이 가장 좋아하는 TV 프로그램은 무엇입니까?", + "French": "Quelle est votre émission de télévision préférée ?", + "German": "Was ist deine lieblings Fernsehserie?" + }, + { + "English": "Let's have a picnic", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们去野餐吧", + "Spanish": "vamos de picnic", + "Hindi": "चलो पिकनिक पर चलते हैं", + "Arabic": "دعنا نذهب للنزهة", + "Portuguese": "vamos fazer um piquenique", + "Bengali": "চল পিকনিক করতে যাই", + "Russian": "пойдем на пикник", + "Japanese": "ピクニックに行きましょう", + "Punjabi": "ਚਲੋ ਇੱਕ ਪਿਕਨਿਕ ਲਈ ਚੱਲੀਏ", + "Javanese": "ayo piknik", + "Korean": "소풍 가자", + "French": "allons pique-niquer", + "German": "Lass uns ein Picknick machen" + }, + { + "English": "Do you like to cook?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你喜欢做饭吗?", + "Spanish": "¿Te gusta cocinar?", + "Hindi": "क्या आपको खाना पकाना अच्छा लगता है?", + "Arabic": "هل تحب أن تطهو؟", + "Portuguese": "Você gosta de cozinhar?", + "Bengali": "তুমি কি রান্না করতে পছন্দ কর?", + "Russian": "Тебе нравится готовить?", + "Japanese": "料理するのは好きですか?", + "Punjabi": "ਕੀ ਤੁਹਾਨੂੰ ਖਾਣਾ ਪਕਾਉਣਾ ਪਸੰਦ ਹੈ?", + "Javanese": "Apa sampeyan seneng masak?", + "Korean": "요리하는 걸 좋아하시나요?", + "French": "Aimez-vous cuisiner?", + "German": "Kochst du gerne?" + }, + { + "English": "What's your favorite restaurant?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的餐馆是什么?", + "Spanish": "¿Cuál es su restaurante favorito?", + "Hindi": "तुम्हारा पसंदीदा रेस्टोरेंट कौन सा है?", + "Arabic": "ما هو مطعمك المفضل؟", + "Portuguese": "Qual é o seu restaurante favorito?", + "Bengali": "আপনার প্রিয় রেস্টুরেন্ট কি?", + "Russian": "Какой твой любимый ресторан?", + "Japanese": "あなたのお気に入りのレストランは何ですか?", + "Punjabi": "ਤੁਹਾਡਾ ਮਨਪਸੰਦ ਰੈਸਟੋਰੈਂਟ ਕਿਹੜਾ ਹੈ?", + "Javanese": "Apa restoran favorit sampeyan?", + "Korean": "당신이 가장 좋아하는 레스토랑은 무엇입니까?", + "French": "Quel est votre restaurant préféré?", + "German": "Welches ist dein Lieblingsrestaurant?" + }, + { + "English": "Let's go to a concert", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们去听音乐会吧", + "Spanish": "vamos a un concierto", + "Hindi": "चलो एक संगीत कार्यक्रम में चलते हैं", + "Arabic": "دعنا نذهب إلى حفلة موسيقية", + "Portuguese": "Vamos a um concerto", + "Bengali": "চল একটা কনসার্টে যাই", + "Russian": "Пойдем на концерт", + "Japanese": "コンサートに行きましょう", + "Punjabi": "ਚਲੋ ਇੱਕ ਸੰਗੀਤ ਸਮਾਰੋਹ ਵਿੱਚ ਚੱਲੀਏ", + "Javanese": "Ayo konser", + "Korean": "콘서트에 가자", + "French": "Allons à un concert", + "German": "Lass uns auf ein Konzert gehen" + }, + { + "English": "Do you like art?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你喜欢艺术吗?", + "Spanish": "¿Te gusta el arte?", + "Hindi": "क्या आपको कला पसंद है?", + "Arabic": "هل تحب الفن؟", + "Portuguese": "Você gosta de arte?", + "Bengali": "তুমি কি আর্ট পছন্দ কর?", + "Russian": "Вам нравится искусство?", + "Japanese": "アートは好きですか?", + "Punjabi": "ਕੀ ਤੁਹਾਨੂੰ ਕਲਾ ਪਸੰਦ ਹੈ?", + "Javanese": "Apa sampeyan seneng seni?", + "Korean": "예술을 좋아하시나요?", + "French": "Aimez-vous l'art?", + "German": "Magst du Kunst?" + }, + { + "English": "What's your favorite season?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的季节是什么?", + "Spanish": "¿Cuál es tu temporada favorita?", + "Hindi": "तुम्हारे पसंदिदा मौसम कौनसा है?", + "Arabic": "ما هو الموسم المفضل لديك؟", + "Portuguese": "Qual é a sua estação favorita?", + "Bengali": "আপনার প্রিয় ঋতু কি?", + "Russian": "Какой твой любимый сезон?", + "Japanese": "一番好きな季節は何ですか?", + "Punjabi": "ਤੁਹਾਡਾ ਮਨਪਸੰਦ ਸੀਜ਼ਨ ਕਿਹੜਾ ਹੈ?", + "Javanese": "Apa musim favoritmu?", + "Korean": "너는 어느 계절은 좋아하니?", + "French": "Quelle est ta saison favorite?", + "German": "Welche Jahreszeit magst du am liebsten?" + }, + { + "English": "Let's go hiking", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们去徒步吧", + "Spanish": "Vamos de caminata", + "Hindi": "आइये लंबी पैदल यात्रा पर चले", + "Arabic": "دعنا نذهب المشي لمسافات طويلة", + "Portuguese": "vamos fazer caminhadas", + "Bengali": "চলো হাইকিং করতে যাই", + "Russian": "пойдем в поход", + "Japanese": "ハイキングに行きましょう", + "Punjabi": "ਆਓ ਹਾਈਕਿੰਗ 'ਤੇ ਚੱਲੀਏ", + "Javanese": "ayo mlaku-mlaku", + "Korean": "하이킹 가자", + "French": "allons faire de la randonnée", + "German": "Lass uns wandern gehen" + }, + { + "English": "Do you like to dance?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你喜欢跳舞吗?", + "Spanish": "¿Te gusta bailar?", + "Hindi": "क्या आप नृत्य करना पसंद करेंगे?", + "Arabic": "هل تحب الرقص؟", + "Portuguese": "Você gosta de dançar?", + "Bengali": "তুমি কি নাচতে চাও?", + "Russian": "Тебе нравится танцевать?", + "Japanese": "ダンスは好きですか?", + "Punjabi": "ਤੁਹਾਨੂੰ ਨਾਚ ਕਰਣਾ ਪਸੰਦ ਹੈ?", + "Javanese": "Apa sampeyan seneng nari?", + "Korean": "당신은 춤추는 것을 좋아합니까?", + "French": "Aimez-vous danser?", + "German": "Tanzen Sie gerne?" + }, + { + "English": "What's your favorite animal?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的动物是什么?", + "Spanish": "¿Cuál es tu animal favorito?", + "Hindi": "आपका पसंदीदा जानवर क्या है?", + "Arabic": "ما هو حيوانك المفضل؟", + "Portuguese": "Qual é o seu animal favorito?", + "Bengali": "আপনার প্রিয় পশু কি?", + "Russian": "Какое твое любимое животное?", + "Japanese": "あなたのお気に入りの動物は何ですか?", + "Punjabi": "ਤੁਹਾਡਾ ਮਨਪਸੰਦ ਜਾਨਵਰ ਕੀ ਹੈ?", + "Javanese": "Apa kewan favoritmu?", + "Korean": "당신이 가장 좋아하는 동물은 무엇입니까?", + "French": "Quel est ton animal favori?", + "German": "Welches ist dein Lieblingstier?" + }, + { + "English": "Let's go to a park", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们去公园吧", + "Spanish": "vamos al parque", + "Hindi": "आओ पार्क में चलें", + "Arabic": "دعنا نذهب إلى الحديقة", + "Portuguese": "vamos ao parque", + "Bengali": "চলো পার্কে যাই", + "Russian": "пойдем в парк", + "Japanese": "公園に行きましょう", + "Punjabi": "ਚਲੋ ਪਾਰਕ ਵਿੱਚ ਚੱਲੀਏ", + "Javanese": "ayo menyang taman", + "Korean": "공원에 가자", + "French": "Allons au parc", + "German": "gehen wir in den Park" + }, + { + "English": "Do you like to draw?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你喜欢画画吗?", + "Spanish": "¿Te gusta dibujar?", + "Hindi": "क्या आपको आकर्षित करना अच्छा लगता है?", + "Arabic": "هل ترغب في رسم؟", + "Portuguese": "Você gosta de desenhar?", + "Bengali": "তুমি কি আঁকতে পছন্দ করো?", + "Russian": "Тебе нравится рисовать?", + "Japanese": "絵を描くのは好きですか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਖਿੱਚਣਾ ਪਸੰਦ ਕਰਦੇ ਹੋ?", + "Javanese": "Apa sampeyan seneng nggambar?", + "Korean": "그림 그리기를 좋아하시나요?", + "French": "Aimes-tu dessiner?", + "German": "Magst du es zu malen?" + }, + { + "English": "What's your favorite holiday?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的节日是什么?", + "Spanish": "¿Cuáles son tus vacaciones favoritas?", + "Hindi": "आपका पसंदीदा अवकाश क्या है?", + "Arabic": "ما هي عطلتك المفضلة؟", + "Portuguese": "Qual o seu feriado favorito?", + "Bengali": "আপনার প্রিয় ছুটির দিন কি?", + "Russian": "Какой ваш любимый праздник?", + "Japanese": "あなたの好きな休日は何ですか?", + "Punjabi": "ਤੁਹਾਡੀ ਮਨਪਸੰਦ ਛੁੱਟੀ ਕੀ ਹੈ?", + "Javanese": "Apa liburan favorit sampeyan?", + "Korean": "당신이 가장 좋아하는 휴일은 무엇입니까?", + "French": "Quelle est votre fête préférée ?", + "German": "Was ist dein Lieblingsfeiertag?" + }, + { + "English": "Let's take a trip", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们去旅行吧", + "Spanish": "vamos a viajar", + "Hindi": "चलो यात्रा पर चलें", + "Arabic": "دعنا نذهب للسفر", + "Portuguese": "vamos viajar", + "Bengali": "চলো বেড়াতে যাই", + "Russian": "поехали путешествовать", + "Japanese": "旅行に行きましょう", + "Punjabi": "ਚਲੋ ਯਾਤਰਾ ਕਰੀਏ", + "Javanese": "ayo padha lelungan", + "Korean": "여행 가자", + "French": "allons voyager", + "German": "Lass uns reisen gehen" + }, + { + "English": "Do you like to swim?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你喜欢游泳吗?", + "Spanish": "¿Te gusta nadar?", + "Hindi": "क्या तुम्हे तैरना पसंद है?", + "Arabic": "هل تحب السباحة؟", + "Portuguese": "Você gosta de nadar?", + "Bengali": "তুমি কি সাঁতার পছন্দ করো?", + "Russian": "Вам нравится плавание?", + "Japanese": "水泳は好きですか?", + "Punjabi": "ਕੀ ਤੁਹਾਨੂੰ ਤੈਰਾਕੀ ਪਸੰਦ ਹੈ?", + "Javanese": "Apa sampeyan seneng nglangi?", + "Korean": "수영 좋아해?", + "French": "Aime-tu nager?", + "German": "Magst du schwimmen?" + }, + { + "English": "What's your favorite drink?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的饮料是什么?", + "Spanish": "¿Cuál es tu bebida favorita?", + "Hindi": "आपका पसंदीदा पेय क्या है?", + "Arabic": "ماهو مشروبك المفضل؟", + "Portuguese": "Qual é a sua bebida favorita?", + "Bengali": "আপনার প্রিয় পানীয় কি?", + "Russian": "Какой твой любимый напиток?", + "Japanese": "あなたのお気に入りの飲み物はなんですか?", + "Punjabi": "ਤੁਹਾਡਾ ਮਨਪਸੰਦ ਡਰਿੰਕ ਕੀ ਹੈ?", + "Javanese": "Apa ngombe favoritmu?", + "Korean": "당신이 가장 좋아하는 음료는 무엇입니까?", + "French": "Quelle est votre boisson préférée ?", + "German": "Was ist dein Lieblingsgetränk?" + }, + { + "English": "Let's go bowling", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们去打保龄球吧", + "Spanish": "Vamos a los bolos", + "Hindi": "चलो गेंदबाजी करने चले", + "Arabic": "دعنا نذهب البولينج", + "Portuguese": "vamos jogar boliche", + "Bengali": "বোলিং করা যাক", + "Russian": "пойдем в боулинг", + "Japanese": "ボーリングに行きましょう", + "Punjabi": "ਚਲੋ ਗੇਂਦਬਾਜ਼ੀ ਕਰੀਏ", + "Javanese": "ayo bowling", + "Korean": "볼링 치러 가자", + "French": "allons au bowling", + "German": "Lass uns bowlen gehen" + }, + { + "English": "Do you like video games?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你喜欢电子游戏吗?", + "Spanish": "¿Te gustan los videojuegos?", + "Hindi": "क्या आपको ये वीडियो गेम पसंद हैं?", + "Arabic": "هل تحب ألعاب الفيديو؟", + "Portuguese": "Você gosta de video games?", + "Bengali": "তুমি কি ভিডিও গেইমস পছন্দ কর?", + "Russian": "Вам нравятся видеоигры?", + "Japanese": "ビデオゲームは好きですか?", + "Punjabi": "ਕੀ ਤੁਹਾਨੂੰ ਵੀਡੀਓ ਗੇਮਾਂ ਪਸੰਦ ਹਨ?", + "Javanese": "Apa sampeyan seneng video game?", + "Korean": "비디오 게임을 좋아하시나요?", + "French": "Est-ce que tu aimes les jeux vidéos?", + "German": "Magst du Videospiele?" + }, + { + "English": "What's your favorite place to visit?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢去的地方是哪里?", + "Spanish": "¿Cuál es tu lugar favorito para visitar?", + "Hindi": "घूमने के लिए आपकी पसंदीदा जगह कहां है?", + "Arabic": "ما هو المكان المفضل لديك للزيارة؟", + "Portuguese": "Qual é o seu lugar favorito para visitar?", + "Bengali": "দেখার জন্য আপনার প্রিয় জায়গা কোথায়?", + "Russian": "Какое место вам больше всего нравится посещать?", + "Japanese": "あなたのお気に入りの訪問先はどこですか?", + "Punjabi": "ਦੇਖਣ ਲਈ ਤੁਹਾਡੀ ਮਨਪਸੰਦ ਜਗ੍ਹਾ ਕਿੱਥੇ ਹੈ?", + "Javanese": "Ing endi panggonan favorit sampeyan?", + "Korean": "가장 좋아하는 방문 장소는 어디인가요?", + "French": "Quel est votre endroit préféré à visiter ?", + "German": "Wo besuchen Sie am liebsten?" + }, + { + "English": "Let's go to a museum", + "sceneType": "Making friends", + "Chinese (Simplified)": "我们去博物馆吧", + "Spanish": "vamos al museo", + "Hindi": "चलो संग्रहालय चलते हैं", + "Arabic": "دعنا نذهب إلى المتحف", + "Portuguese": "vamos ao museu", + "Bengali": "চল যাদুঘরে যাই", + "Russian": "пойдем в музей", + "Japanese": "美術館に行きましょう", + "Punjabi": "ਚਲੋ ਅਜਾਇਬ ਘਰ ਚੱਲੀਏ", + "Javanese": "ayo menyang museum", + "Korean": "박물관에 가자", + "French": "allons au musée", + "German": "Lass uns ins Museum gehen" + }, + { + "English": "Do you like to sing?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你喜欢唱歌吗?", + "Spanish": "¿Te gusta cantar?", + "Hindi": "क्या आपको गाना पसंद है?", + "Arabic": "هل تحب الغناء؟", + "Portuguese": "Você gosta de cantar?", + "Bengali": "তুমি কি গান গাইতে পছন্দ করো?", + "Russian": "Тебе нравиться петь?", + "Japanese": "歌うのは好きですか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਗਾਉਣਾ ਪਸੰਦ ਕਰਦੇ ਹੋ?", + "Javanese": "Apa sampeyan seneng nyanyi?", + "Korean": "당신은 노래하는 것을 좋아합니까?", + "French": "Aimez-vous chanter?", + "German": "Magst du es zu singen?" + }, + { + "English": "What's your favorite song?", + "sceneType": "Making friends", + "Chinese (Simplified)": "你最喜欢的歌曲是什么?", + "Spanish": "¿Cuál es tu canción favorita?", + "Hindi": "आपका पसंदीदा गाना कौन सा है?", + "Arabic": "ما هي أغنيتك المفضلة؟", + "Portuguese": "Qual é a tua canção favorita?", + "Bengali": "আপনার প্রিয় গান কি?", + "Russian": "Какая твоя любимая песня?", + "Japanese": "あなたの好きな曲は何ですか?", + "Punjabi": "ਤੁਹਾਡਾ ਮਨਪਸੰਦ ਗੀਤ ਕੀ ਹੈ?", + "Javanese": "Apa lagu favoritmu?", + "Korean": "당신이 가장 좋아하는 노래는 무엇입니까?", + "French": "Quelle est ta chanson préférée?", + "German": "Was ist dein Lieblingslied?" + } + ] + }, + { + "sceneSource": "Dining", + "sceneType": "Dining", + "sceneList": [ + { + "English": "I'm hungry", + "sceneType": "Dining", + "Chinese (Simplified)": "我饿了", + "Spanish": "tengo hambre", + "Hindi": "मुझे भूख लगी है", + "Arabic": "أنا جائع", + "Portuguese": "estou com fome", + "Bengali": "আমি ক্ষুধার্ত", + "Russian": "Я голоден", + "Japanese": "お腹が空きました", + "Punjabi": "ਮੈਨੂੰ ਭੁੱਖ ਲੱਗੀ ਹੈ", + "Javanese": "aku luwe", + "Korean": "배고파요", + "French": "j'ai faim", + "German": "Ich bin hungrig" + }, + { + "English": "Let's eat", + "sceneType": "Dining", + "Chinese (Simplified)": "我们吃吧", + "Spanish": "Comamos", + "Hindi": "चलो खाते हैं", + "Arabic": "دعونا نأكل", + "Portuguese": "vamos comer", + "Bengali": "চলো খাই", + "Russian": "Давайте есть", + "Japanese": "食べましょう", + "Punjabi": "ਆਉ ਖਾਈਏ", + "Javanese": "ayo mangan", + "Korean": "먹자", + "French": "mangeons", + "German": "Lass uns essen" + }, + { + "English": "The food is delicious", + "sceneType": "Dining", + "Chinese (Simplified)": "食物很好吃", + "Spanish": "La comida está deliciosa", + "Hindi": "खाना स्वादिष्ट है", + "Arabic": "الطعام لذيذ", + "Portuguese": "A comida está deliciosa", + "Bengali": "খাবারটা দারুন সুস্বাদু", + "Russian": "Еда очень вкусная", + "Japanese": "その食べ物は美味しい", + "Punjabi": "ਭੋਜਨ ਸੁਆਦੀ ਹੈ", + "Javanese": "Panganan iku enak", + "Korean": "음식이 맛있다", + "French": "La nourriture est délicieuse", + "German": "Das Essen ist lecker" + }, + { + "English": "Can I have the menu?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以看看菜单吗?", + "Spanish": "¿Puedo ver el menú?", + "Hindi": "क्या मैं मेनू देख सकता हूं?", + "Arabic": "هلا أريتني قائمة الطعام؟", + "Portuguese": "Eu posso ver o cardápio?", + "Bengali": "আমি কি মেনু দেখতে পারি?", + "Russian": "Могу ли я увидеть меню?", + "Japanese": "メニューを見てもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਮੀਨੂ ਦੇਖ ਸਕਦਾ\/ਸਕਦੀ ਹਾਂ?", + "Javanese": "Aku bisa ndeleng menu?", + "Korean": "메뉴를 볼 수 있나요?", + "French": "Est-ce que je peux voir le menu?", + "German": "Kann ich die Speisekarte sehen?" + }, + { + "English": "Check, please", + "sceneType": "Dining", + "Chinese (Simplified)": "请结账", + "Spanish": "Comprueba, por favor", + "Hindi": "कृपया जांच करें", + "Arabic": "تحقق من فضلك", + "Portuguese": "Verifique, por favor", + "Bengali": "পরীক্ষা করে দেখুন", + "Russian": "Проверьте, пожалуйста", + "Japanese": "お会計お願いします", + "Punjabi": "ਕ੍ਰਿਪਾ ਕਰਕੇ, ਜਾਂਚ ਕਰੋ", + "Javanese": "Priksa, mangga", + "Korean": "확인하시기 바랍니다", + "French": "Vérifiez, s'il vous plaît", + "German": "Bitte überprüfen" + }, + { + "English": "Do you have a reservation?", + "sceneType": "Dining", + "Chinese (Simplified)": "你有预订吗?", + "Spanish": "¿Tiene una reserva?", + "Hindi": "क्या आपका रिज़र्वेशन है?", + "Arabic": "هل لديك حجز؟", + "Portuguese": "Você tem reserva?", + "Bengali": "আপনার কি রিজার্ভেশন আছে?", + "Russian": "Вы бронировали?", + "Japanese": "予約はありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਰਿਜਰਵੇਸ਼ਨ ਹੈ?", + "Javanese": "Apa sampeyan duwe reservasi?", + "Korean": "예약 하셨나요?", + "French": "Avez-vous une réservation?", + "German": "Haben Sie eine Reservierung?" + }, + { + "English": "I would like to order", + "sceneType": "Dining", + "Chinese (Simplified)": "我想点菜", + "Spanish": "quiero pedir comida", + "Hindi": "मुझे खाना ऑर्डर करना है", + "Arabic": "أريد أن أطلب الطعام", + "Portuguese": "Eu quero pedir comida", + "Bengali": "আমি খাবার অর্ডার করতে চাই", + "Russian": "Я хочу заказать еду", + "Japanese": "食べ物を注文したいのですが", + "Punjabi": "ਮੈਂ ਭੋਜਨ ਆਰਡਰ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹਾਂ", + "Javanese": "Aku arep pesen panganan", + "Korean": "음식을 주문하고 싶어요", + "French": "Je veux commander de la nourriture", + "German": "Ich möchte Essen bestellen" + }, + { + "English": "What do you recommend?", + "sceneType": "Dining", + "Chinese (Simplified)": "你推荐什么?", + "Spanish": "¿Qué me recomienda?", + "Hindi": "आपका क्या सुझाव हैं?", + "Arabic": "بماذا تنصح؟", + "Portuguese": "O que você recomenda?", + "Bengali": "আপনি কি প্রস্তাব করছেন?", + "Russian": "Что вы порекомендуете?", + "Japanese": "おすすめは何ですか?", + "Punjabi": "ਤੁਸੀਂ ਕੀ ਸਲਾਹ ਦਿਓਗੇ?", + "Javanese": "Apa sing disaranake?", + "Korean": "추천 메뉴가 무엇인가요?", + "French": "Que recommandez-vous?", + "German": "Was empfehlen Sie?" + }, + { + "English": "Can I have some water?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以要些水吗?", + "Spanish": "¿Puedo tomar un poco de agua?", + "Hindi": "क्या मुझे थोड़ा पानी मिल सकता है?", + "Arabic": "هل أستطيع الحصول على بعض الماء؟", + "Portuguese": "Posso beber um pouco de água?", + "Bengali": "আমি কি পানি পেতে পারি?", + "Russian": "Можно ли мне немного воды?", + "Japanese": "お水をいただいてもいいですか?", + "Punjabi": "ਕੀ ਮੈਨੂੰ ਕੁਝ ਪਾਣੀ ਮਿਲ ਸਕਦਾ ਹੈ?", + "Javanese": "Apa aku bisa njaluk sawetara banyu?", + "Korean": "저 물 좀 주실 래요?", + "French": "Puis-je avoir de l'eau?", + "German": "Kann ich etwas Wasser haben?" + }, + { + "English": "Excuse me, where is the restroom?", + "sceneType": "Dining", + "Chinese (Simplified)": "请问洗手间在哪里?", + "Spanish": "¿Dónde está el baño?", + "Hindi": "टॉयलेट कहां है?", + "Arabic": "أين المرحاض؟", + "Portuguese": "Onde é o banheiro?", + "Bengali": "বিশ্রাম কক্ষটি কোথায়?", + "Russian": "Где находится туалет?", + "Japanese": "トイレはどこですか?", + "Punjabi": "ਰੈਸਟਰੂਮ ਕਿੱਥੇ ਹੈ?", + "Javanese": "Ing endi toilet?", + "Korean": "화장실이 어디예요?", + "French": "Où sont les toilettes ?", + "German": "Wo ist die Toilette?" + }, + { + "English": "Is this dish spicy?", + "sceneType": "Dining", + "Chinese (Simplified)": "这道菜辣吗?", + "Spanish": "¿Este plato es picante?", + "Hindi": "क्या यह व्यंजन मसालेदार है?", + "Arabic": "هل هذا الطبق حار؟", + "Portuguese": "Este prato é picante?", + "Bengali": "এই থালা মশলাদার?", + "Russian": "Это блюдо острое?", + "Japanese": "この料理は辛いですか?", + "Punjabi": "ਕੀ ਇਹ ਪਕਵਾਨ ਮਸਾਲੇਦਾਰ ਹੈ?", + "Javanese": "Apa panganan iki pedhes?", + "Korean": "이 요리는 매워요?", + "French": "Ce plat est-il épicé ?", + "German": "Ist dieses Gericht scharf?" + }, + { + "English": "I'm full", + "sceneType": "Dining", + "Chinese (Simplified)": "我饱了", + "Spanish": "estoy lleno", + "Hindi": "मेरा पेट भरा है", + "Arabic": "شبعت", + "Portuguese": "eu estou cheio", + "Bengali": "আমি পরিপূর্ণ", + "Russian": "я полный", + "Japanese": "おなかいっぱいです", + "Punjabi": "ਮੈਂ ਪੂਰਾ ਹਾਂ", + "Javanese": "aku kenyang", + "Korean": "나는 배불러요", + "French": "je suis plein", + "German": "ich bin voll" + }, + { + "English": "Can I have the bill?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以要账单吗?", + "Spanish": "¿Puedo tener una factura?", + "Hindi": "क्या मुझे बिल मिल सकता है?", + "Arabic": "هل يمكنني الحصول على فاتورة؟", + "Portuguese": "Posso ter uma conta?", + "Bengali": "আমি একটি বিল পেতে পারি?", + "Russian": "Могу ли я получить счет?", + "Japanese": "請求書をいただけますか?", + "Punjabi": "ਕੀ ਮੈਨੂੰ ਇੱਕ ਬਿੱਲ ਮਿਲ ਸਕਦਾ ਹੈ?", + "Javanese": "Aku bisa njaluk tagihan?", + "Korean": "청구서를 받을 수 있나요?", + "French": "Puis-je avoir une facture ?", + "German": "Kann ich eine Rechnung haben?" + }, + { + "English": "Is this seat taken?", + "sceneType": "Dining", + "Chinese (Simplified)": "这个座位有人吗?", + "Spanish": "¿Está libre este asiento?", + "Hindi": "क्या यह सीट दे दी गई है?", + "Arabic": "هل تم شغل هذا المقعد؟", + "Portuguese": "Este assento está ocupado?", + "Bengali": "এই সীটে কি কেউ বসেছেন?", + "Russian": "Здесь свободно?", + "Japanese": "この席は空いていますか?", + "Punjabi": "ਕੀ ਇਸ ਸੀਟ ਤੇ ਕੋਈ ਬੈਠਾ ਹੋਇਆ ਹੈ?", + "Javanese": "Apa kursi iki dijupuk?", + "Korean": "자리 있나요?", + "French": "Ce siège est-il occupé ?", + "German": "Ist dieser Platz belegt?" + }, + { + "English": "Can I have a glass of wine?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以要一杯酒吗?", + "Spanish": "¿Puedo tomar una copa de vino?", + "Hindi": "क्या मुझे एक ग्लास वाइन मिल सकती है?", + "Arabic": "هل أستطيع الحصول على كأس من النبيذ؟", + "Portuguese": "Posso tomar uma taça de vinho?", + "Bengali": "আমি কি এক গ্লাস ওয়াইন পেতে পারি?", + "Russian": "Можно мне бокал вина?", + "Japanese": "ワインを一杯いただけますか?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਕ ਗਲਾਸ ਵਾਈਨ ਲੈ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa njaluk segelas anggur?", + "French": "Puis-je avoir un verre de vin ?", + "German": "Kann ich ein Glas Wein haben?" + }, + { + "English": "Do you have vegetarian options?", + "sceneType": "Dining", + "Chinese (Simplified)": "你们有素食选项吗?", + "Spanish": "¿Tienes opciones vegetarianas?", + "Hindi": "क्या आपके पास शाकाहारी विकल्प हैं?", + "Arabic": "هل لديك خيارات نباتية؟", + "Portuguese": "Você tem opções vegetarianas?", + "Bengali": "আপনি নিরামিষ বিকল্প আছে?", + "Russian": "У вас есть вегетарианские блюда?", + "Japanese": "ベジタリアンのオプションはありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਸ਼ਾਕਾਹਾਰੀ ਵਿਕਲਪ ਹਨ?", + "Javanese": "Apa sampeyan duwe pilihan vegetarian?", + "Korean": "채식 옵션이 있나요?", + "French": "Avez-vous des options végétariennes ?", + "German": "Haben Sie vegetarische Optionen?" + }, + { + "English": "Can I see the dessert menu?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以看看甜点菜单吗?", + "Spanish": "¿Puedo ver la carta de postres?", + "Hindi": "क्या मैं मिठाई मेनू देख सकता हूँ?", + "Arabic": "هل يمكنني رؤية قائمة الحلوى؟", + "Portuguese": "Posso ver o menu de sobremesas?", + "Bengali": "আমি কি ডেজার্ট মেনু দেখতে পারি?", + "Russian": "Могу ли я увидеть десертное меню?", + "Japanese": "デザートメニューを見てもらえますか?", + "Punjabi": "ਕੀ ਮੈਂ ਮਿਠਆਈ ਮੀਨੂ ਦੇਖ ਸਕਦਾ\/ਸਕਦੀ ਹਾਂ?", + "Javanese": "Apa aku bisa ndeleng menu panganan cuci mulut?", + "Korean": "디저트 메뉴를 볼 수 있나요?", + "French": "Puis-je voir la carte des desserts ?", + "German": "Kann ich die Dessertkarte sehen?" + }, + { + "English": "I'll have the same", + "sceneType": "Dining", + "Chinese (Simplified)": "我和他一样", + "Spanish": "soy igual que el", + "Hindi": "मैं उसके जैसा ही हूं", + "Arabic": "أنا نفس الشيء مثله", + "Portuguese": "Eu sou igual a ele", + "Bengali": "আমি তার মতোই", + "Russian": "Я такой же, как он", + "Japanese": "私も彼と同じです", + "Punjabi": "ਮੈਂ ਉਸ ਵਰਗਾ ਹੀ ਹਾਂ", + "Javanese": "Aku padha karo dheweke", + "Korean": "나도 그 사람이랑 똑같아", + "French": "je suis le même que lui", + "German": "Ich bin genauso wie er" + }, + { + "English": "Please bring us some napkins", + "sceneType": "Dining", + "Chinese (Simplified)": "请给我们一些餐巾", + "Spanish": "por favor danos algunas servilletas", + "Hindi": "कृपया हमें कुछ नैपकिन दीजिए", + "Arabic": "من فضلك أعطنا بعض المناديل", + "Portuguese": "por favor nos dê alguns guardanapos", + "Bengali": "দয়া করে আমাদের কিছু ন্যাপকিন দিন", + "Russian": "пожалуйста, дайте нам салфетки", + "Japanese": "私たちにナプキンをください", + "Punjabi": "ਕਿਰਪਾ ਕਰਕੇ ਸਾਨੂੰ ਕੁਝ ਨੈਪਕਿਨ ਦਿਓ", + "Javanese": "mangga wenehi serbet", + "Korean": "냅킨 좀 주세요", + "French": "s'il te plaît, donne-nous des serviettes", + "German": "Bitte gib uns ein paar Servietten" + }, + { + "English": "Can we have the check?", + "sceneType": "Dining", + "Hindi": "क्या हम जाँच कर सकते हैं?", + "Bengali": "আমরা চেক আউট করতে পারি?", + "Russian": "Можем ли мы выехать?", + "Japanese": "チェックアウトしてもいいですか?", + "Punjabi": "ਕੀ ਅਸੀਂ ਜਾਂਚ ਕਰ ਸਕਦੇ ਹਾਂ?", + "Javanese": "Apa kita bisa mriksa metu?", + "Korean": "확인해볼까요?", + "French": "Pouvons-nous vérifier ?", + "German": "Können wir auschecken?" + }, + { + "English": "Is there a special today?", + "sceneType": "Dining", + "Chinese (Simplified)": "今天有什么特别推荐吗?", + "Spanish": "¿Alguna recomendación especial hoy?", + "Hindi": "आज कोई विशेष सिफ़ारिशें?", + "Arabic": "هل هناك أي توصيات خاصة اليوم؟", + "Portuguese": "Alguma recomendação especial hoje?", + "Bengali": "আজ কোন বিশেষ সুপারিশ?", + "Russian": "Какие-нибудь особые рекомендации сегодня?", + "Japanese": "今日は何か特別なおすすめはありますか?", + "Punjabi": "ਅੱਜ ਕੋਈ ਵਿਸ਼ੇਸ਼ ਸਿਫ਼ਾਰਸ਼ਾਂ?", + "Javanese": "Apa ana rekomendasi khusus dina iki?", + "Korean": "오늘은 특별한 추천이 있나요?", + "French": "Des recommandations particulières aujourd’hui ?", + "German": "Gibt es heute besondere Empfehlungen?" + }, + { + "English": "Can I get this to go?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以打包吗?", + "Spanish": "¿Puedo empacarlo?", + "Hindi": "क्या मैं इसे पैक कर सकता हूँ?", + "Arabic": "هل يمكنني حزمه؟", + "Portuguese": "Posso embalar?", + "Bengali": "আমি কি এটা প্যাক করতে পারি?", + "Russian": "Могу ли я упаковать его?", + "Japanese": "梱包してもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਇਸਨੂੰ ਪੈਕ ਕਰ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa ngemas?", + "Korean": "포장해도 될까요?", + "French": "Puis-je l'emballer ?", + "German": "Kann ich es einpacken?" + }, + { + "English": "I'd like a refill, please", + "sceneType": "Dining", + "Chinese (Simplified)": "请给我续杯", + "Spanish": "Por favor dame una recarga", + "Hindi": "कृपया मुझे एक रिफिल दीजिए", + "Arabic": "من فضلك أعطني الملء", + "Portuguese": "Por favor, me dê uma recarga", + "Bengali": "আমাকে একটি রিফিল দিন", + "Russian": "Пожалуйста, дайте мне пополнение", + "Japanese": "おかわりください", + "Punjabi": "ਕਿਰਪਾ ਕਰਕੇ ਮੈਨੂੰ ਇੱਕ ਰੀਫਿਲ ਦਿਓ", + "Javanese": "Tolong paringi ngisi ulang", + "Korean": "리필해주세요", + "French": "S'il vous plaît, donnez-moi une recharge", + "German": "Bitte geben Sie mir eine Nachfüllung" + }, + { + "English": "Do you have any specials?", + "sceneType": "Dining", + "Chinese (Simplified)": "你们有特别推荐吗?", + "Spanish": "¿Tiene alguna recomendación especial?", + "Hindi": "क्या आपके पास कोई विशेष सिफारिशें हैं?", + "Arabic": "هل لديك أي توصيات خاصة؟", + "Portuguese": "Você tem alguma recomendação especial?", + "Bengali": "আপনি কোন বিশেষ সুপারিশ আছে?", + "Russian": "Есть ли у вас особые рекомендации?", + "Japanese": "特別な推奨事項はありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਵਿਸ਼ੇਸ਼ ਸਿਫ਼ਾਰਸ਼ਾਂ ਹਨ?", + "Javanese": "Apa sampeyan duwe rekomendasi khusus?", + "Korean": "특별한 추천 사항이 있나요?", + "French": "Avez-vous des recommandations particulières ?", + "German": "Haben Sie spezielle Empfehlungen?" + }, + { + "English": "Can I have a coffee?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以要一杯咖啡吗?", + "Spanish": "¿Puedo tener una taza de café?", + "Hindi": "क्या मुझे एक कप कॉफी मिलेगी?", + "Arabic": "هل أستطيع الحصول على كوب من القهوة؟", + "Portuguese": "Posso tomar uma xícara de café?", + "Bengali": "আমি কি এক কাপ কফি খেতে পারি?", + "Russian": "Можно мне чашечку кофе?", + "Japanese": "コーヒーを一杯いただけますか?", + "Punjabi": "ਕੀ ਮੈਂ ਇੱਕ ਕੱਪ ਕੌਫੀ ਲੈ ਸਕਦਾ\/ਸਕਦੀ ਹਾਂ?", + "Javanese": "Apa aku bisa ngombe secangkir kopi?", + "Korean": "커피 한잔 해도 될까요?", + "French": "Est ce que je pourrais avoir une tasse de café?", + "German": "Darf ich eine Tasse Kaffee haben?" + }, + { + "English": "What is the soup of the day?", + "sceneType": "Dining", + "Chinese (Simplified)": "今天的例汤是什么?", + "Spanish": "¿Cuál es la sopa de hoy?", + "Hindi": "आज का सूप क्या है?", + "Arabic": "ما هو حساء اليوم؟", + "Portuguese": "Qual é a sopa de hoje?", + "Bengali": "আজকের স্যুপ কি?", + "Russian": "Какой сегодня суп?", + "Japanese": "今日のスープは何ですか?", + "Punjabi": "ਅੱਜ ਦਾ ਸੂਪ ਕੀ ਹੈ?", + "Javanese": "Apa sup dina iki?", + "Korean": "오늘의 수프는 무엇입니까?", + "French": "C'est quoi la soupe du jour ?", + "German": "Was gibt es heute für eine Suppe?" + }, + { + "English": "I'd like a table for two", + "sceneType": "Dining", + "Chinese (Simplified)": "我想要一张两人的桌子", + "Spanish": "Quisiera una mesa para dos", + "Hindi": "मुझे दो लोगों के लिए एक टेबल चाहिए", + "Arabic": "أريد طاولة لشخصين", + "Portuguese": "Queria uma mesa para duas pessoas", + "Bengali": "আমি দুজনের জন্য একটি টেবিল চাই", + "Russian": "Мне нужен столик на двоих", + "Japanese": "二人用のテーブルをお願いします", + "Punjabi": "ਮੈਨੂੰ ਦੋ ਲੋਕਾਂ ਲਈ ਇਕ ਟੇਬਲ ਚਾਹੁੰਦਾ ਹੈ", + "Javanese": "Aku pengin meja kanggo loro", + "Korean": "2인용 테이블을 원해요", + "French": "Je voudrais une table pour deux", + "German": "Ich hätte gerne einen Tisch für zwei Personen" + }, + { + "English": "Can I have the check, please?", + "sceneType": "Dining", + "Chinese (Simplified)": "请给我账单", + "Spanish": "por favor dame la factura", + "Hindi": "कृपया मुझे बिल दीजिए", + "Arabic": "من فضلك أعطني الفاتورة", + "Portuguese": "por favor me dê a conta", + "Bengali": "দয়া করে আমাকে বিল দিন", + "Russian": "пожалуйста, дайте мне счет", + "Japanese": "請求書をください", + "Punjabi": "ਕਿਰਪਾ ਕਰਕੇ ਮੈਨੂੰ ਬਿੱਲ ਦਿਓ", + "Javanese": "mangga wenehi tagihan", + "Korean": "청구서를 주세요", + "French": "s'il te plaît, donne-moi la facture", + "German": "Bitte geben Sie mir die Rechnung" + }, + { + "English": "Could you please bring me a knife?", + "sceneType": "Dining", + "Chinese (Simplified)": "你能给我拿把刀吗?", + "Spanish": "¿Puedes conseguirme un cuchillo?", + "Hindi": "क्या आप मुझे चाकू ला सकते हैं?", + "Arabic": "هل يمكنك أن تحضر لي سكيناً؟", + "Portuguese": "Você pode me arranjar uma faca?", + "Bengali": "আপনি আমাকে একটি ছুরি পেতে পারেন?", + "Russian": "Можешь принести мне нож?", + "Japanese": "ナイフをもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੈਨੂੰ ਚਾਕੂ ਲੈ ਸਕਦੇ ਹੋ?", + "Javanese": "Apa sampeyan bisa njaluk piso?", + "Korean": "칼 좀 갖다 주시겠어요?", + "French": "Tu peux m'apporter un couteau ?", + "German": "Kannst du mir ein Messer besorgen?" + }, + { + "English": "What are today's specials?", + "sceneType": "Dining", + "Chinese (Simplified)": "今天的特别推荐是什么?", + "Spanish": "¿Cuál es tu recomendación especial hoy?", + "Hindi": "आज आपकी विशेष सिफ़ारिश क्या है?", + "Arabic": "ما هي توصيتك الخاصة اليوم؟", + "Portuguese": "Qual é a sua recomendação especial hoje?", + "Bengali": "আজ আপনার বিশেষ সুপারিশ কি?", + "Russian": "Какова ваша особая рекомендация сегодня?", + "Japanese": "今日の特別なおすすめは何ですか?", + "Punjabi": "ਅੱਜ ਤੁਹਾਡੀ ਵਿਸ਼ੇਸ਼ ਸਿਫ਼ਾਰਸ਼ ਕੀ ਹੈ?", + "Javanese": "Apa rekomendasi khusus sampeyan dina iki?", + "Korean": "오늘의 특별한 추천은 무엇인가요?", + "French": "Quelle est votre recommandation spéciale aujourd’hui ?", + "German": "Was ist heute Ihre besondere Empfehlung?" + }, + { + "English": "Is there a kids' menu?", + "sceneType": "Dining", + "Chinese (Simplified)": "有儿童菜单吗?", + "Spanish": "¿Hay menú infantil?", + "Hindi": "क्या बच्चों का कोई मेनू है?", + "Arabic": "هل هناك قائمة للأطفال؟", + "Portuguese": "Existe menu infantil?", + "Bengali": "একটি শিশুদের মেনু আছে?", + "Russian": "Есть ли детское меню?", + "Japanese": "お子様メニューはありますか?", + "Punjabi": "ਕੀ ਇੱਥੇ ਬੱਚਿਆਂ ਦਾ ਮੀਨੂ ਹੈ?", + "Javanese": "Apa ana menu kanggo bocah-bocah?", + "Korean": "어린이 메뉴가 있나요?", + "French": "Y a-t-il un menu pour enfants ?", + "German": "Gibt es eine Kinderkarte?" + }, + { + "English": "Do you have gluten-free options?", + "sceneType": "Dining", + "Chinese (Simplified)": "你们有无麸质选项吗?", + "Spanish": "¿Tienes opciones sin gluten?", + "Hindi": "क्या आपके पास ग्लूटेन मुक्त विकल्प हैं?", + "Arabic": "هل لديك خيارات خالية من الغلوتين؟", + "Portuguese": "Você tem opções sem glúten?", + "Bengali": "আপনার কি গ্লুটেন মুক্ত বিকল্প আছে?", + "Russian": "У вас есть безглютеновые блюда?", + "Japanese": "グルテンフリーのオプションはありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਗਲੁਟਨ ਮੁਕਤ ਵਿਕਲਪ ਹਨ?", + "Javanese": "Apa sampeyan duwe pilihan bebas gluten?", + "Korean": "글루텐 프리 옵션이 있나요?", + "French": "Avez-vous des options sans gluten ?", + "German": "Gibt es glutenfreie Optionen?" + }, + { + "English": "Can I get a doggy bag?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以要个打包盒吗?", + "Spanish": "¿Puedo tener una caja de embalaje?", + "Hindi": "क्या मुझे पैकिंग बॉक्स मिल सकता है?", + "Arabic": "هل يمكنني الحصول على صندوق التعبئة ؟", + "Portuguese": "Posso ter uma caixa de embalagem?", + "Bengali": "আমি কি একটি প্যাকিং বক্স পেতে পারি?", + "Russian": "Могу ли я получить упаковочную коробку?", + "Japanese": "梱包箱はもらえますか?", + "Punjabi": "ਕੀ ਮੇਰੇ ਕੋਲ ਪੈਕਿੰਗ ਬਾਕਸ ਹੈ?", + "Javanese": "Apa aku bisa duwe kothak packing?", + "Korean": "포장박스를 받을 수 있나요?", + "French": "Puis-je avoir une boîte d'emballage ?", + "German": "Kann ich eine Verpackungsbox haben?" + }, + { + "English": "Can I have a side of fries?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以要一份薯条吗?", + "Spanish": "¿Puedo comer unas patatas fritas?", + "Hindi": "क्या मुझे कुछ फ्राइज़ मिल सकते हैं?", + "Arabic": "هل أستطيع الحصول على بعض البطاطس المقلية؟", + "Portuguese": "Posso comer algumas batatas fritas?", + "Bengali": "আমি কিছু ভাজা পেতে পারি?", + "Russian": "Можно мне немного картошки фри?", + "Japanese": "フライドポテトを食べてもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਕੁਝ ਫਰਾਈ ਲੈ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa njaluk sawetara gorengan?", + "Korean": "감자튀김 좀 먹어도 될까요?", + "French": "Je peux avoir des frites ?", + "German": "Kann ich ein paar Pommes haben?" + }, + { + "English": "What kind of desserts do you have?", + "sceneType": "Dining", + "Chinese (Simplified)": "你们有什么甜点?", + "Spanish": "¿Qué postres tienes?", + "Hindi": "आपके पास कौन सी मिठाइयाँ हैं?", + "Arabic": "ما هي الحلويات لديك؟", + "Portuguese": "Que sobremesas você tem?", + "Bengali": "আপনার কি ডেজার্ট আছে?", + "Russian": "Какие десерты у вас есть?", + "Japanese": "どんなデザートがありますか?", + "Punjabi": "ਤੁਹਾਡੇ ਕੋਲ ਕਿਹੜੀਆਂ ਮਿਠਾਈਆਂ ਹਨ?", + "Javanese": "Apa panganan cuci mulut sampeyan duwe?", + "Korean": "어떤 디저트가 있나요?", + "French": "Quels desserts avez-vous ?", + "German": "Welche Desserts gibt es?" + }, + { + "English": "Could I get a bottle of water?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以要一瓶水吗?", + "Spanish": "¿Puedo tener una botella de agua?", + "Hindi": "क्या मुझे पानी की एक बोतल मिल सकती है?", + "Arabic": "هل أستطيع الحصول على زجاجة ماء؟", + "Portuguese": "Posso pegar uma garrafa de água?", + "Bengali": "আমি কি পানির বোতল পেতে পারি?", + "Russian": "Можно мне бутылку воды?", + "Japanese": "水のボトルをいただけますか?", + "Punjabi": "ਕੀ ਮੈਨੂੰ ਪਾਣੀ ਦੀ ਬੋਤਲ ਮਿਲ ਸਕਦੀ ਹੈ?", + "Javanese": "Apa aku bisa njaluk botol banyu?", + "Korean": "물 한 병 주시겠어요?", + "French": "Puis-je avoir une bouteille d'eau ?", + "German": "Kann ich eine Flasche Wasser haben?" + }, + { + "English": "I'd like to make a reservation", + "sceneType": "Dining", + "Chinese (Simplified)": "我想预订", + "Spanish": "quiero reservar", + "Hindi": "मैं बुक करना चाहता हूँ", + "Arabic": "أريد أن أحجز", + "Portuguese": "eu quero reservar", + "Bengali": "আমি বুক করতে চাই", + "Russian": "хочу заказать", + "Japanese": "予約したいです", + "Punjabi": "ਮੈਂ ਬੁੱਕ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹਾਂ", + "Javanese": "Aku arep Book", + "Korean": "예약하고 싶어요", + "French": "je veux réserver", + "German": "ich möchte buchen" + }, + { + "English": "Do you have non-alcoholic drinks?", + "sceneType": "Dining", + "Chinese (Simplified)": "你们有不含酒精的饮料吗?", + "Spanish": "¿Tienes bebidas no alcohólicas?", + "Hindi": "क्या आपके पास गैर-अल्कोहल पेय पदार्थ हैं?", + "Arabic": "هل لديكم مشروبات غير كحولية؟", + "Portuguese": "Você toma bebidas não alcoólicas?", + "Bengali": "আপনার কি অ অ্যালকোহলযুক্ত পানীয় আছে?", + "Russian": "У вас есть безалкогольные напитки?", + "Japanese": "ノンアルコール飲料はありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਗੈਰ-ਸ਼ਰਾਬ ਪੀਣ ਵਾਲੇ ਪਦਾਰਥ ਹਨ?", + "Javanese": "Apa sampeyan duwe omben-omben non-alkohol?", + "Korean": "무알콜 음료가 있나요?", + "French": "Avez-vous des boissons non alcoolisées ?", + "German": "Haben Sie alkoholfreie Getränke?" + }, + { + "English": "Could you please bring me the salt?", + "sceneType": "Dining", + "Chinese (Simplified)": "你能给我拿些盐吗?", + "Spanish": "¿Puedes traerme un poco de sal?", + "Hindi": "क्या आप मेरे लिए कुछ नमक ला सकते हैं?", + "Arabic": "هل يمكنك أن تحضر لي بعض الملح؟", + "Portuguese": "Você pode me trazer um pouco de sal?", + "Bengali": "আপনি কি আমাকে কিছু লবণ দিতে পারেন?", + "Russian": "Можешь принести мне немного соли?", + "Japanese": "塩をもらえますか?", + "Punjabi": "ਕੀ ਤੁਸੀਂ ਮੈਨੂੰ ਲੂਣ ਦੇ ਸਕਦੇ ਹੋ?", + "Javanese": "Sampeyan bisa njaluk kula sawetara uyah?", + "Korean": "소금 좀 갖다 주시겠어요?", + "French": "Tu peux m'apporter du sel ?", + "German": "Kannst du mir etwas Salz besorgen?" + }, + { + "English": "Can I get extra sauce?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以多要点酱吗?", + "Spanish": "¿Puedo pedir más salsa?", + "Hindi": "क्या मैं और सॉस ऑर्डर कर सकता हूँ?", + "Arabic": "هل يمكنني طلب المزيد من الصلصة؟", + "Portuguese": "Posso pedir mais molho?", + "Bengali": "আমি কি আরও সস অর্ডার করতে পারি?", + "Russian": "Могу ли я заказать еще соуса?", + "Japanese": "ソースをもっと注文できますか?", + "Punjabi": "ਕੀ ਮੈਂ ਹੋਰ ਸਾਸ ਆਰਡਰ ਕਰ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa pesen saos liyane?", + "Korean": "소스를 더 주문할 수 있나요?", + "French": "Puis-je commander plus de sauce ?", + "German": "Kann ich mehr Soße bestellen?" + }, + { + "English": "What's in this dish?", + "sceneType": "Dining", + "Chinese (Simplified)": "这道菜里面有什么?", + "Spanish": "¿Qué hay en este plato?", + "Hindi": "इस डिश में क्या है?", + "Arabic": "ماذا يوجد في هذا الطبق؟", + "Portuguese": "O que há neste prato?", + "Bengali": "কি আছে এই থালায়?", + "Russian": "Что в этом блюде?", + "Japanese": "この料理には何が入っていますか?", + "Punjabi": "ਇਸ ਪਕਵਾਨ ਵਿੱਚ ਕੀ ਹੈ?", + "Javanese": "Apa sing ana ing sajian iki?", + "Korean": "이 요리에는 무엇이 들어있나요?", + "French": "Qu'y a-t-il dans ce plat ?", + "German": "Was ist in diesem Gericht?" + }, + { + "English": "Can I get a cup of tea?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以要一杯茶吗?", + "Spanish": "¿Puedo tomar una taza de té?", + "Hindi": "क्या मुझें एक कप चाय मिल सकता है?", + "Arabic": "هل يمكنني الحصول على كوب من الشاي؟", + "Portuguese": "Posso tomar uma xícara de chá?", + "Bengali": "আমি এক কাপ চা পেতে পারি?", + "Russian": "Можно мне чашечку чая?", + "Japanese": "お茶を飲んでもいいですか?", + "Punjabi": "ਕੀ ਮੈਂ ਚਾਹ ਦਾ ਕੱਪ ਲੈ ਸਕਦਾ ਹਾਂ?", + "Javanese": "Apa aku bisa ngombe secangkir teh?", + "Korean": "차 한잔해도 될까요?", + "French": "Puis-je avoir une tasse de thé?", + "German": "Kann ich eine Tasse Tee haben?" + }, + { + "English": "Can I see the wine list?", + "sceneType": "Dining", + "Chinese (Simplified)": "我可以看看酒单吗?", + "Spanish": "¿Puedo ver una lista de vinos?", + "Hindi": "क्या मैं शराब की सूची देख सकता हूँ?", + "Arabic": "هل بإمكاني رؤية لائحة النبيذ ؟", + "Portuguese": "Posso ver o cardápio de vinhos?", + "Bengali": "আমি একটি ওয়াইন তালিকা দেখতে পারি?", + "Russian": "Можно посмотреть винную карту?", + "Japanese": "ワインリストを見せて頂けますか?", + "Punjabi": "ਕੀ ਮੈ ਸੋਮਰਸ ਦੀ ਸੂਚੀ ਦੇਖ ਸੱਕਦਾਹਾਂ?", + "Javanese": "Apa aku bisa ndeleng dhaptar anggur?", + "Korean": "와인 리스트를 좀 볼 수 있을까요?", + "French": "Puis-je voir une carte des vins?", + "German": "Könnte ich bitte die Weinkarte bekommen?" + }, + { + "English": "Do you have any vegan options?", + "sceneType": "Dining", + "Chinese (Simplified)": "你们有纯素选项吗?", + "Spanish": "¿Tienes opciones veganas?", + "Hindi": "क्या आपके पास शाकाहारी विकल्प हैं?", + "Arabic": "هل لديك خيارات نباتية؟", + "Portuguese": "Você tem opções veganas?", + "Bengali": "আপনি নিরামিষ বিকল্প আছে?", + "Russian": "У вас есть веганские варианты?", + "Japanese": "ビーガンのオプションはありますか?", + "Punjabi": "ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਸ਼ਾਕਾਹਾਰੀ ਵਿਕਲਪ ਹਨ?", + "Javanese": "Apa sampeyan duwe pilihan vegan?", + "Korean": "채식주의 옵션이 있나요?", + "French": "Avez-vous des options végétaliennes ?", + "German": "Gibt es vegane Optionen?" + }, + { + "English": "I'll have the chicken", + "sceneType": "Dining", + "Chinese (Simplified)": "我要鸡肉", + "Spanish": "quiero pollo", + "Hindi": "मुझे चिकन चाहिए", + "Arabic": "اريد دجاجا", + "Portuguese": "eu quero frango", + "Bengali": "আমি মুরগী ​​চাই", + "Russian": "я хочу курицу", + "Japanese": "チキンが欲しいです", + "Punjabi": "ਮੈਨੂੰ ਚਿਕਨ ਚਾਹੀਦਾ ਹੈ", + "Javanese": "Aku pengin pitik", + "Korean": "나는 치킨을 원한다", + "French": "je veux du poulet", + "German": "ich will Hühnchen" + }, + { + "English": "Can we have some bread?", + "sceneType": "Dining", + "Chinese (Simplified)": "我们可以要些面包吗?", + "Spanish": "¿Podemos comer algo de pan?", + "Hindi": "क्या हमें कुछ रोटी मिल सकती है?", + "Arabic": "هل يمكننا الحصول على بعض الخبز؟", + "Portuguese": "Podemos comer um pouco de pão?", + "Bengali": "আমরা কিছু রুটি পেতে পারি?", + "Russian": "Можно нам немного хлеба?", + "Japanese": "パンを食べてもいいですか?", + "Punjabi": "ਕੀ ਸਾਨੂੰ ਰੋਟੀ ਮਿਲ ਸਕਦੀ ਹੈ?", + "Javanese": "Apa kita bisa njaluk sawetara roti?", + "Korean": "우리 빵 좀 먹어도 될까요?", + "French": "Pouvons-nous avoir du pain ?", + "German": "Können wir etwas Brot haben?" + }, + { + "English": "Is this gluten-free?", + "sceneType": "Dining", + "Chinese (Simplified)": "这是无麸质的吗?", + "Spanish": "¿Esto es libre de gluten?", + "Hindi": "क्या यह ग्लूटेन मुक्त है?", + "Arabic": "هل هذا خالي من الغلوتين؟", + "Portuguese": "Isso é sem glúten?", + "Bengali": "এই গ্লুটেন বিনামূল্যে?", + "Russian": "Это без глютена?", + "Japanese": "これはグルテンフリーですか?", + "Punjabi": "ਕੀ ਇਹ ਗਲੁਟਨ ਮੁਕਤ ਹੈ?", + "Javanese": "Apa iki bebas gluten?", + "Korean": "이거 글루텐 프리인가요?", + "French": "Est-ce sans gluten ?", + "German": "Ist das glutenfrei?" + } + ] + } +] \ No newline at end of file diff --git a/assets/launcher/icon.png b/assets/launcher/icon.png new file mode 100755 index 0000000..7869ecf Binary files /dev/null and b/assets/launcher/icon.png differ diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..7c56964 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..c4855bf --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..06232cb --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,72 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + pod 'AppLovinDSPLinkedInAdapter' + pod 'AppLovinMediationVungleAdapter' + pod 'AppLovinMediationByteDanceAdapter' + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + + target.build_configurations.each do |config| + # You can remove unused permissions here + # for more information: https://github.com/BaseflowIT/flutter-permission-handler/blob/master/permission_handler/ios/Classes/PermissionHandlerEnums.h + # e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0' + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + + ## dart: PermissionGroup.camera + 'PERMISSION_CAMERA=1', + + ## dart: PermissionGroup.photos + 'PERMISSION_PHOTOS=1', + + ## dart: PermissionGroup.microphone + 'PERMISSION_MICROPHONE=1', + + ## dart: PermissionGroup.speech + 'PERMISSION_SPEECH_RECOGNIZER=1', + + ## dart: PermissionGroup.appTrackingTransparency + 'PERMISSION_APP_TRACKING_TRANSPARENCY=1', + ] + end + end +end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..95094f2 --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,779 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4EB89C2A47A5E9F33BF9CC23 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3814550291B0F737473BCB1 /* Pods_RunnerTests.framework */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + BE886AC0511E1128DB36725D /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA08CC9967724BA66EE42AC8 /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2250054E34A92A9021434563 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 2F5A8951A180656195AA1607 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 5DB5C0D4C36164CD4B0D7A44 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7847AC63CB5296101B2AEB2A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 907F42F98DC96F715B34D636 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A0AB3C9AA431282B18B7EEBE /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E3814550291B0F737473BCB1 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EA08CC9967724BA66EE42AC8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 49644C696F8B7967EB47D50E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4EB89C2A47A5E9F33BF9CC23 /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BE886AC0511E1128DB36725D /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + E9F97B68E1F9AD8331204D34 /* Pods */, + E2C9BE77607CAA0D48D3B188 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + E2C9BE77607CAA0D48D3B188 /* Frameworks */ = { + isa = PBXGroup; + children = ( + EA08CC9967724BA66EE42AC8 /* Pods_Runner.framework */, + E3814550291B0F737473BCB1 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + E9F97B68E1F9AD8331204D34 /* Pods */ = { + isa = PBXGroup; + children = ( + 2250054E34A92A9021434563 /* Pods-Runner.debug.xcconfig */, + 7847AC63CB5296101B2AEB2A /* Pods-Runner.release.xcconfig */, + 2F5A8951A180656195AA1607 /* Pods-Runner.profile.xcconfig */, + A0AB3C9AA431282B18B7EEBE /* Pods-RunnerTests.debug.xcconfig */, + 907F42F98DC96F715B34D636 /* Pods-RunnerTests.release.xcconfig */, + 5DB5C0D4C36164CD4B0D7A44 /* Pods-RunnerTests.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 0912F5D3BFEDD1F1E08E51B2 /* [CP] Check Pods Manifest.lock */, + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + 49644C696F8B7967EB47D50E /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 795ED539967ABEB91AE0324D /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 8BC211534722FCBC4357F29B /* [CP] Embed Pods Frameworks */, + 9886CE82CE0F193B2EF15110 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 0912F5D3BFEDD1F1E08E51B2 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 795ED539967ABEB91AE0324D /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 8BC211534722FCBC4357F29B /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + 9886CE82CE0F193B2EF15110 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 8DQD6BV6H9; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.translation.text.easy; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Easy_Translation_Dev; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A0AB3C9AA431282B18B7EEBE /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.flutter.translate.flutterTranslate.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 907F42F98DC96F715B34D636 /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.flutter.translate.flutterTranslate.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5DB5C0D4C36164CD4B0D7A44 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.flutter.translate.flutterTranslate.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 8DQD6BV6H9; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.translation.text.easy; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Easy_Translation_Dev; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 8DQD6BV6H9; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.translation.text.easy; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Easy_Translation_Release; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..8e3ca5d --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..9074fee --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..ed346d7 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..c282cc7 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..2690bb0 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..18909b2 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..b54f563 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..1bf3e84 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..0c34299 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..2690bb0 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..da44b18 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..60c20b7 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000..c56aba5 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000..f260155 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000..0d46c7d Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 0000000..25809a3 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..60c20b7 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..a53bdb0 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000..d531df5 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000..67fa85c Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..c55855d Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..b33a479 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..fbf3d8d Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100755 index 0000000..713ccc1 Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100755 index 0000000..af6e4ba Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100755 index 0000000..6c5fd4c Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..b012aa7 --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist new file mode 100644 index 0000000..ed63da0 --- /dev/null +++ b/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyC-bw0H4PPLNUVBMJb4KVlg_Co_fomvX8c + GCM_SENDER_ID + 681504526197 + PLIST_VERSION + 1 + BUNDLE_ID + com.translation.text.easy + PROJECT_ID + transease-226ba + STORAGE_BUCKET + transease-226ba.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:681504526197:ios:bb5142cc7e70d8fe118d3c + + \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..0ba44d1 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,519 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Easy translation + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + easy_translation + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + NSCameraUsageDescription + This will enable you to take photos and recognize text within them for translation. + NSMicrophoneUsageDescription + This will enable you to input content through voice for recognition and translation. + NSPhotoLibraryUsageDescription + This will enable you to select photos from your library for text recognition and translation. + NSSpeechRecognitionUsageDescription + This will enable you to use speech recognition to convert voice content to text for translation. + NSUserTrackingUsageDescription + This will help us provide a more personalized advertising experience. Your data privacy will be protected. + CFBundleURLTypes + + + CFBundleURLSchemes + + fb1604127000445610 + + + + FacebookAppID + 1604127000445610 + FacebookClientToken + e545fee5752a28a03c99f79c7e4d823b + FacebookDisplayName + Easy translation + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + SKAdNetworkItems + + + SKAdNetworkIdentifier + 22mmun2rn5.skadnetwork + + SKAdNetworkIdentifier + 238da6jt44.skadnetwork + + SKAdNetworkIdentifier + 24t9a8vw3c.skadnetwork + + SKAdNetworkIdentifier + 24zw6aqk47.skadnetwork + + SKAdNetworkIdentifier + 252b5q8x7y.skadnetwork + + SKAdNetworkIdentifier + 275upjj5gd.skadnetwork + + SKAdNetworkIdentifier + 294l99pt4k.skadnetwork + + SKAdNetworkIdentifier + 2fnua5tdw4.skadnetwork + + SKAdNetworkIdentifier + 2u9pt9hc89.skadnetwork + + SKAdNetworkIdentifier + 32z4fx6l9h.skadnetwork + + SKAdNetworkIdentifier + 3l6bd9hu43.skadnetwork + + SKAdNetworkIdentifier + 3qcr597p9d.skadnetwork + + SKAdNetworkIdentifier + 3qy4746246.skadnetwork + + SKAdNetworkIdentifier + 3rd42ekr43.skadnetwork + + SKAdNetworkIdentifier + 3sh42y64q3.skadnetwork + + SKAdNetworkIdentifier + 424m5254lk.skadnetwork + + SKAdNetworkIdentifier + 4468km3ulz.skadnetwork + + SKAdNetworkIdentifier + 44jx6755aq.skadnetwork + + SKAdNetworkIdentifier + 44n7hlldy6.skadnetwork + + SKAdNetworkIdentifier + 47vhws6wlr.skadnetwork + + SKAdNetworkIdentifier + 488r3q3dtq.skadnetwork + + SKAdNetworkIdentifier + 4dzt52r2t5.skadnetwork + + SKAdNetworkIdentifier + 4fzdc2evr5.skadnetwork + + SKAdNetworkIdentifier + 4mn522wn87.skadnetwork + + SKAdNetworkIdentifier + 4pfyvq9l8r.skadnetwork + + SKAdNetworkIdentifier + 4w7y6s5ca2.skadnetwork + + SKAdNetworkIdentifier + 523jb4fst2.skadnetwork + + SKAdNetworkIdentifier + 52fl2v3hgk.skadnetwork + + SKAdNetworkIdentifier + 54nzkqm89y.skadnetwork + + SKAdNetworkIdentifier + 578prtvx9j.skadnetwork + + SKAdNetworkIdentifier + 5a6flpkh64.skadnetwork + + SKAdNetworkIdentifier + 5l3tpt7t6e.skadnetwork + + SKAdNetworkIdentifier + 5lm9lj6jb7.skadnetwork + + SKAdNetworkIdentifier + 5tjdwbrq8w.skadnetwork + + SKAdNetworkIdentifier + 6964rsfnh4.skadnetwork + + SKAdNetworkIdentifier + 6g9af3uyq4.skadnetwork + + SKAdNetworkIdentifier + 6p4ks3rnbw.skadnetwork + + SKAdNetworkIdentifier + 6v7lgmsu45.skadnetwork + + SKAdNetworkIdentifier + 6xzpu9s2p8.skadnetwork + + SKAdNetworkIdentifier + 737z793b9f.skadnetwork + + SKAdNetworkIdentifier + 74b6s63p6l.skadnetwork + + SKAdNetworkIdentifier + 79pbpufp6p.skadnetwork + + SKAdNetworkIdentifier + 7fmhfwg9en.skadnetwork + + SKAdNetworkIdentifier + 7rz58n8ntl.skadnetwork + + SKAdNetworkIdentifier + 7ug5zh24hu.skadnetwork + + SKAdNetworkIdentifier + 84993kbrcf.skadnetwork + + SKAdNetworkIdentifier + 89z7zv988g.skadnetwork + + SKAdNetworkIdentifier + 8c4e2ghe7u.skadnetwork + + SKAdNetworkIdentifier + 8m87ys6875.skadnetwork + + SKAdNetworkIdentifier + 8r8llnkz5a.skadnetwork + + SKAdNetworkIdentifier + 8s468mfl3y.skadnetwork + + SKAdNetworkIdentifier + 97r2b46745.skadnetwork + + SKAdNetworkIdentifier + 9b89h5y424.skadnetwork + + SKAdNetworkIdentifier + 9nlqeag3gk.skadnetwork + + SKAdNetworkIdentifier + 9rd848q2bz.skadnetwork + + SKAdNetworkIdentifier + 9t245vhmpl.skadnetwork + + SKAdNetworkIdentifier + 9vvzujtq5s.skadnetwork + + SKAdNetworkIdentifier + 9yg77x724h.skadnetwork + + SKAdNetworkIdentifier + a2p9lx4jpn.skadnetwork + + SKAdNetworkIdentifier + a7xqa6mtl2.skadnetwork + + SKAdNetworkIdentifier + a8cz6cu7e5.skadnetwork + + SKAdNetworkIdentifier + av6w8kgt66.skadnetwork + + SKAdNetworkIdentifier + b9bk5wbcq9.skadnetwork + + SKAdNetworkIdentifier + bxvub5ada5.skadnetwork + + SKAdNetworkIdentifier + c3frkrj4fj.skadnetwork + + SKAdNetworkIdentifier + c6k4g5qg8m.skadnetwork + + SKAdNetworkIdentifier + cg4yq2srnc.skadnetwork + + SKAdNetworkIdentifier + cj5566h2ga.skadnetwork + + SKAdNetworkIdentifier + cp8zw746q7.skadnetwork + + SKAdNetworkIdentifier + cs644xg564.skadnetwork + + SKAdNetworkIdentifier + cstr6suwn9.skadnetwork + + SKAdNetworkIdentifier + dbu4b84rxf.skadnetwork + + SKAdNetworkIdentifier + dkc879ngq3.skadnetwork + + SKAdNetworkIdentifier + dzg6xy7pwj.skadnetwork + + SKAdNetworkIdentifier + e5fvkxwrpn.skadnetwork + + SKAdNetworkIdentifier + ecpz2srf59.skadnetwork + + SKAdNetworkIdentifier + eh6m2bh4zr.skadnetwork + + SKAdNetworkIdentifier + ejvt5qm6ak.skadnetwork + + SKAdNetworkIdentifier + f38h382jlk.skadnetwork + + SKAdNetworkIdentifier + f73kdq92p3.skadnetwork + + SKAdNetworkIdentifier + f7s53z58qe.skadnetwork + + SKAdNetworkIdentifier + feyaarzu9v.skadnetwork + + SKAdNetworkIdentifier + g28c52eehv.skadnetwork + + SKAdNetworkIdentifier + g2y4y55b64.skadnetwork + + SKAdNetworkIdentifier + ggvn48r87g.skadnetwork + + SKAdNetworkIdentifier + glqzh8vgby.skadnetwork + + SKAdNetworkIdentifier + gta8lk7p23.skadnetwork + + SKAdNetworkIdentifier + gta9lk7p23.skadnetwork + + SKAdNetworkIdentifier + hb56zgv37p.skadnetwork + + SKAdNetworkIdentifier + hdw39hrw9y.skadnetwork + + SKAdNetworkIdentifier + hs6bdukanm.skadnetwork + + SKAdNetworkIdentifier + k674qkevps.skadnetwork + + SKAdNetworkIdentifier + kbd757ywx3.skadnetwork + + SKAdNetworkIdentifier + kbmxgpxpgc.skadnetwork + + SKAdNetworkIdentifier + klf5c3l5u5.skadnetwork + + SKAdNetworkIdentifier + krvm3zuq6h.skadnetwork + + SKAdNetworkIdentifier + lr83yxwka7.skadnetwork + + SKAdNetworkIdentifier + ludvb6z3bs.skadnetwork + + SKAdNetworkIdentifier + m297p6643m.skadnetwork + + SKAdNetworkIdentifier + m5mvw97r93.skadnetwork + + SKAdNetworkIdentifier + m8dbw4sv7c.skadnetwork + + SKAdNetworkIdentifier + mlmmfzh3r3.skadnetwork + + SKAdNetworkIdentifier + mls7yz5dvl.skadnetwork + + SKAdNetworkIdentifier + mp6xlyr22a.skadnetwork + + SKAdNetworkIdentifier + mtkv5xtk9e.skadnetwork + + SKAdNetworkIdentifier + n38lu8286q.skadnetwork + + SKAdNetworkIdentifier + n66cz3y3bx.skadnetwork + + SKAdNetworkIdentifier + n6fk4nfna4.skadnetwork + + SKAdNetworkIdentifier + n9x2a789qt.skadnetwork + + SKAdNetworkIdentifier + nzq8sh4pbs.skadnetwork + + SKAdNetworkIdentifier + p78axxw29g.skadnetwork + + SKAdNetworkIdentifier + ppxm28t8ap.skadnetwork + + SKAdNetworkIdentifier + prcb7njmu6.skadnetwork + + SKAdNetworkIdentifier + pwa73g5rt2.skadnetwork + + SKAdNetworkIdentifier + pwdxu55a5a.skadnetwork + + SKAdNetworkIdentifier + qqp299437r.skadnetwork + + SKAdNetworkIdentifier + r45fhb6rf7.skadnetwork + + SKAdNetworkIdentifier + rvh3l7un93.skadnetwork + + SKAdNetworkIdentifier + rx5hdcabgc.skadnetwork + + SKAdNetworkIdentifier + s39g8k73mm.skadnetwork + + SKAdNetworkIdentifier + s69wq72ugq.skadnetwork + + SKAdNetworkIdentifier + su67r6k2v3.skadnetwork + + SKAdNetworkIdentifier + t38b2kh725.skadnetwork + + SKAdNetworkIdentifier + tl55sbb4fm.skadnetwork + + SKAdNetworkIdentifier + u679fj5vs4.skadnetwork + + SKAdNetworkIdentifier + uw77j35x4d.skadnetwork + + SKAdNetworkIdentifier + v4nxqhlyqp.skadnetwork + + SKAdNetworkIdentifier + v72qych5uu.skadnetwork + + SKAdNetworkIdentifier + v79kvwwj4g.skadnetwork + + SKAdNetworkIdentifier + v9wttpbfk9.skadnetwork + + SKAdNetworkIdentifier + vcra2ehyfk.skadnetwork + + SKAdNetworkIdentifier + vutu7akeur.skadnetwork + + SKAdNetworkIdentifier + w9q455wk68.skadnetwork + + SKAdNetworkIdentifier + wg4vff78zm.skadnetwork + + SKAdNetworkIdentifier + wzmmz9fp6w.skadnetwork + + SKAdNetworkIdentifier + x44k69ngh6.skadnetwork + + SKAdNetworkIdentifier + x5l83yy675.skadnetwork + + SKAdNetworkIdentifier + x8jxxk4ff5.skadnetwork + + SKAdNetworkIdentifier + x8uqf25wch.skadnetwork + + SKAdNetworkIdentifier + xy9t38ct57.skadnetwork + + SKAdNetworkIdentifier + y45688jllp.skadnetwork + + SKAdNetworkIdentifier + y5ghdn5j9k.skadnetwork + + SKAdNetworkIdentifier + yclnxrl5pm.skadnetwork + + SKAdNetworkIdentifier + ydx93a7ass.skadnetwork + + SKAdNetworkIdentifier + z24wtl6j62.skadnetwork + + SKAdNetworkIdentifier + zmvfpc5aq8.skadnetwork + + SKAdNetworkIdentifier + zq492l623r.skadnetwork + + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/lib/ads/interstitial_ad_manage.dart b/lib/ads/interstitial_ad_manage.dart new file mode 100644 index 0000000..bb55f5d --- /dev/null +++ b/lib/ads/interstitial_ad_manage.dart @@ -0,0 +1,161 @@ +// Author: fengshengxiong +// Date: 2024/5/20 +// Description: 插页广告管理 + +import 'dart:async'; +import 'dart:io'; + +import 'package:applovin_max/applovin_max.dart'; +import 'package:flutter_translate/common/hive/remote_config_box.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; +import 'package:flutter_translate/firebase/firebase_analytics_manager.dart'; +import 'package:flutter_translate/pages/launch/launch_controller.dart'; +import 'package:get/get.dart'; + +class InterstitialAdManager { + InterstitialAdManager._(); + + static final InterstitialAdManager _instance = InterstitialAdManager._(); + + factory InterstitialAdManager() => _instance; + + /// sdkKey + final String applovinKey = '3DO3vx0lv7JMzcKUzBTDPvC_khddtPtpMbruQtJPWTzR8LhPMWHzoPrCWsIz1TSHRclaIWfqyPxLIHJXJR7DaN'; + + /// 广告单元Id + /// 依次是开屏、页面返回按钮、面对面翻译、ocr识别 + final List adIds = [ + Platform.isAndroid ? '' : '1cd8a161ef146654', + Platform.isAndroid ? '' : 'ba63c3d53e30fac4', + Platform.isAndroid ? '' : '60618d77c79b5d88', + Platform.isAndroid ? '' : 'a74b32980e93e067', + ]; + + /// 是否已初始化 + bool isInitialized = false; + + /// 是否显示 + bool isShowingAd = false; + + /// 重试计数 + // final _maxExponentialRetryCount = 6; + // var _interstitialRetryAttempt = 0; + + Function()? onTap; + + /// 初始化 + Future init() async { + try { + MaxConfiguration? configuration = await AppLovinMAX.initialize(applovinKey); + if (configuration != null) { + isInitialized = true; + _attachAdListeners(); + } + } catch (e) { + Log.d(e.toString()); + } + } + + /// 广告监听 + void _attachAdListeners() { + AppLovinMAX.setInterstitialListener(InterstitialListener( + onAdLoadedCallback: (ad) async { + Log.d('插页广告加载成功:${ad.adUnitId}'); + if (ad.adUnitId == adIds[0]) { + if (Get.isRegistered()) { + LaunchController.to.editChangeValue(); + } + } + // _interstitialRetryAttempt = 0; + }, + onAdLoadFailedCallback: (adUnitId, error) { + Log.d('插页广告加载失败adUnitId:$adUnitId,code:${error.code},message:${error.message}'); + // Applovin建议您以指数级更高的延迟重试,最大延迟可达64秒 + // _interstitialRetryAttempt = _interstitialRetryAttempt + 1; + // if (_interstitialRetryAttempt > _maxExponentialRetryCount) return; + // int retryDelay = pow(2, min(_maxExponentialRetryCount, _interstitialRetryAttempt)).toInt(); + + Future.delayed(const Duration(seconds: 10), () { + bool adSwitch = RemoteConfigBox().getAdSwitch(); + if (adSwitch) { + AppLovinMAX.loadInterstitial(adUnitId); + } + }); + }, + onAdDisplayedCallback: (ad) { + Log.d('插页广告显示成功:${ad.adUnitId}'); + isShowingAd = true; + FirebaseAnalyticsManager.logAdsShow(); + }, + onAdDisplayFailedCallback: (ad, error) { + Log.d('插页广告显示失败adUnitId:${ad.adUnitId},code:${error.code},message:${error.message}'); + isShowingAd = false; + + _handleOnTap(); + }, + onAdClickedCallback: (ad) {}, + onAdHiddenCallback: (ad) { + Log.d('插页广告关闭:${ad.adUnitId}'); + isShowingAd = false; + + bool adSwitch = RemoteConfigBox().getAdSwitch(); + if (adSwitch) { + AppLovinMAX.loadInterstitial(ad.adUnitId); + } + _handleOnTap(); + }, + )); + } + + Future loadAllAd() async { + bool adSwitch = RemoteConfigBox().getAdSwitch(); + if (!adSwitch) { + return; + } + if (!isInitialized) { + return; + } + for (var adId in adIds) { + bool isReady = (await AppLovinMAX.isInterstitialReady(adId))!; + if (!isReady) { + Log.d('插页广告正在加载:$adId'); + AppLovinMAX.loadInterstitial(adId); + } + } + } + + /// 显示插页广告,如果准备好 + Future showAdIfReady(String adUnitId, {Function()? onTap}) async { + if (onTap != null) { + this.onTap = onTap; + } + bool adSwitch = RemoteConfigBox().getAdSwitch(); + if (!adSwitch) { + _handleOnTap(); + return; + } + if (!isInitialized) { + _handleOnTap(); + return; + } + bool isReady = (await AppLovinMAX.isInterstitialReady(adUnitId))!; + if (isReady) { + if (isShowingAd) { + Log.d('尝试在已显示广告的情况下显示广告'); + _handleOnTap(); + return; + } + AppLovinMAX.showInterstitial(adUnitId); + } else { + _handleOnTap(); + AppLovinMAX.loadInterstitial(adUnitId); + } + } + + void _handleOnTap() { + if (onTap != null) { + onTap!(); + onTap = null; + } + } +} \ No newline at end of file diff --git a/lib/common/components/base_appbar.dart b/lib/common/components/base_appbar.dart new file mode 100644 index 0000000..2c61541 --- /dev/null +++ b/lib/common/components/base_appbar.dart @@ -0,0 +1,98 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/ads/interstitial_ad_manage.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:get/get.dart'; + +class BaseAppbar extends StatelessWidget implements PreferredSizeWidget { + const BaseAppbar({ + super.key, + this.backgroundColor, + this.backColor, + this.title, + this.titleWidget, + this.actionWidget, + this.onBackTap, + }); + + final Color? backgroundColor; + final Color? backColor; + final String? title; + final Widget? titleWidget; + final Widget? actionWidget; + final Function()? onBackTap; + + @override + Widget build(BuildContext context) { + return AppBar( + backgroundColor: backgroundColor ?? Colors.white, + surfaceTintColor: Colors.transparent, + automaticallyImplyLeading: false, + centerTitle: false, + title: _buildTitle(context), + titleSpacing: 0.0, + leadingWidth: 0.0, + ); + } + + Widget _buildTitle(BuildContext context) { + return SizedBox( + height: preferredSize.height, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: 60.w, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 4).w, + child: FittedBox( + fit: BoxFit.none, + child: ClipOval( + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: onBackTap ?? () { + InterstitialAdManager().showAdIfReady( + InterstitialAdManager().adIds[1], + onTap: () { + Get.back(); + }, + ); + }, + child: Padding( + padding: const EdgeInsets.all(10.0).w, + child: Image.asset( + Assets.iconBack, + width: 24.w, + height: 24.w, + color: backColor?? Colors.black, + ), + ), + ), + ), + ), + ), + ), + ), + titleWidget ?? + Text( + title ?? '', + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Colors.black, + fontSize: 18.sp, + fontWeight: FontWeight.w500, + ), + ), + SizedBox( + width: 60.w, + child: actionWidget, + ), + ], + ), + ); + } + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); +} diff --git a/lib/common/components/common_language_selector.dart b/lib/common/components/common_language_selector.dart new file mode 100644 index 0000000..824ef66 --- /dev/null +++ b/lib/common/components/common_language_selector.dart @@ -0,0 +1,149 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/common/components/common_language_selector_bar.dart'; +import 'package:flutter_translate/global/app_config.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/manager/translate.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:get/get.dart'; +import 'package:get/get_state_manager/get_state_manager.dart'; + +class CommonLanguageSelector extends StatelessWidget { + const CommonLanguageSelector({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height * 0.9, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(26.r), + topRight: Radius.circular(26.r), + ), + ), + child: Column( + children: [ + 12.verticalSpace, + Container( + width: 28.w, + height: 4.w, + decoration: BoxDecoration( + color: const Color(0xffD9D9D9), + borderRadius: BorderRadius.circular(2.r), + ), + ), + 10.verticalSpace, + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10).w, + child: CommonLanguageSelectorBar( + isSelect: true, + changeFromLanguage: () => Translate().changeSelectLanguage(true), + changeToLanguage: () => Translate().changeSelectLanguage(false), + ), + ), + 10.verticalSpace, + _languageList(), + ], + ), + ); + } + + Widget _languageList() { + final HomeController homeController = Get.put(HomeController()); + return Expanded( + child: ListView.builder( + itemCount: Translate().languageList.length, + itemBuilder: (context, index) { + var item = Translate().languageList[index]; + return Material( + color: Colors.transparent, + child: InkWell( + onTap: () => Translate().changeLanguage(item), + child: Container( + padding: const EdgeInsets.symmetric( + vertical: 13, + horizontal: 33, + ).w, + child: Row( + children: [ + Expanded( + child: Obx(() { + return Text( + item.name, + style: TextStyle( + color: Translate().isSelectFromLanguage.value + ? (item.name == + Translate() + .fromLanguageEntity + .value + .name + ? Color(homeController.appColor.value) + : const Color(0xff152A3D)) + : (item.name == + Translate() + .toLanguageEntity + .value + .name + ? Color(homeController.appColor.value) + : const Color(0xff152A3D)), + fontSize: 16.sp, + overflow: TextOverflow.ellipsis, + ), + ); + }), + ), + Obx(() { + return Visibility( + visible: Translate().isSelectFromLanguage.value + ? (item.name == + Translate().fromLanguageEntity.value.name) + : (item.name == + Translate().toLanguageEntity.value.name), + child: Padding( + padding: const EdgeInsets.only(left: 10).w, + child: Image.asset( + Assets.iconStarGreen, + color: Color(homeController.appColor.value), + width: 16.w, + height: 16.w, + ), + ), + ); + }), + ], + ), + ), + ), + ); + }, + ), + ); + } + +// void _itemOnTap(LanguageModel item) { +// if (Translate().isSelectFromLanguage.value) { +// Translate().fromLanguageEntity.update((fn) { +// fn?.code = item.code; +// fn?.name = item.name; +// }); +// } else { +// Translate().toLanguageEntity.update((fn) { +// fn?.code = item.code; +// fn?.name = item.name; +// }); +// } +// if (Get.isRegistered()) { +// HomeController.to.initData(); +// } +// } +// +// void _onTapFrom() { +// Translate().isSelectFromLanguage.value = true; +// } +// +// void _onTapTo() { +// Translate().isSelectFromLanguage.value = false; +// } +} diff --git a/lib/common/components/common_language_selector_bar.dart b/lib/common/components/common_language_selector_bar.dart new file mode 100644 index 0000000..e55c8f2 --- /dev/null +++ b/lib/common/components/common_language_selector_bar.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/global/app_config.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/manager/translate.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:get/get.dart'; + +class CommonLanguageSelectorBar extends StatelessWidget { + const CommonLanguageSelectorBar({ + super.key, + this.isSelect = false, + this.changeFromLanguage, + this.changeToLanguage, + }); + + final bool isSelect; + final Function()? changeFromLanguage; + final Function()? changeToLanguage; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + _language(true), + _convertIcon(), + _language(false), + ], + ); + } + + Widget _convertIcon() { + return GestureDetector( + onTap: Translate().languageConvert, + child: Container( + width: 26.w, + height: 18.w, + margin: const EdgeInsets.symmetric(horizontal: 15).w, + padding: const EdgeInsets.symmetric( + horizontal: 7, + vertical: 3, + ).w, + decoration: BoxDecoration( + color: const Color(0xfff1f1f1), + borderRadius: BorderRadius.circular(9.r), + ), + child: Image.asset(Assets.iconConvert), + ), + ); + } + + Widget _language(isFrom) { + final HomeController homeController = Get.put(HomeController()); + return Expanded( + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: isFrom + ? (changeFromLanguage ?? + () => Translate().languageChangeBottomSheet(true)) + : (changeToLanguage ?? + () => Translate().languageChangeBottomSheet(false)), + child: Obx(() { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + 8.horizontalSpace, + Flexible( + child: Text( + isFrom + ? Translate().fromLanguageEntity.value.name + : Translate().toLanguageEntity.value.name, + style: TextStyle( + color: !isSelect || + (isFrom + ? !Translate().isSelectFromLanguage.value + : Translate().isSelectFromLanguage.value) + ? const Color(0xff435561) + : Color(homeController.appColor.value), + fontSize: 14.sp, + fontWeight: FontWeight.w500, + overflow: TextOverflow.ellipsis, + ), + ), + ), + 4.horizontalSpace, + Image.asset(Assets.iconArrowBottom, width: 8.w), + ], + ); + }), + ), + ), + ); + } + +// void _languageConvert() { +// var code = Translate().toLanguageEntity.value.code; +// var name = Translate().toLanguageEntity.value.name; +// +// Translate().toLanguageEntity.update((fn) { +// fn?.code = Translate().fromLanguageEntity.value.code; +// fn?.name = Translate().fromLanguageEntity.value.name; +// }); +// Translate().fromLanguageEntity.update((fn) { +// fn?.name = code; +// fn?.name = name; +// }); +// } + +// void _changeFromLanguage() { +// Translate().isSelectFromLanguage.value = true; +// Get.bottomSheet( +// isScrollControlled: true, +// const CommonLanguageSelector(), +// ); +// } +// +// void _changeToLanguage() { +// Translate().isSelectFromLanguage.value = false; +// Get.bottomSheet( +// isScrollControlled: true, +// const CommonLanguageSelector(), +// ); +// } +} diff --git a/lib/common/components/dialog/remind_dialog.dart b/lib/common/components/dialog/remind_dialog.dart new file mode 100644 index 0000000..e42cfb1 --- /dev/null +++ b/lib/common/components/dialog/remind_dialog.dart @@ -0,0 +1,122 @@ +// Author: fengshengxiong +// Date: 2024/5/11 +// Description: 提示框 + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/common/components/divider_widget.dart'; +import 'package:get/get.dart'; + +class RemindDialog extends StatelessWidget { + const RemindDialog({ + super.key, + this.title, + this.content, + this.showCancelBtn = true, + this.enableBack = true, + this.cancelText, + this.confirmText, + this.confirmOnTap, + this.popScope = false, + }); + + final String? title; + final String? content; + final bool showCancelBtn; + final bool enableBack; + final String? cancelText; + final String? confirmText; + final Function()? confirmOnTap; + final bool popScope; + + @override + Widget build(BuildContext context) { + return PopScope( + canPop: popScope, + child: Center( + child: Container( + width: 0.8.sw, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: IntrinsicHeight( + child: Column( + children: [ + SizedBox(height: 10.h), + Text( + title ?? 'Reminder', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.black, + fontSize: 18.sp, + fontWeight: FontWeight.w500, + ), + ), + SizedBox(height: 12.h), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10).w, + child: Text( + content ?? '', + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xFF333333), + fontSize: 16.sp, + ), + ), + ), + SizedBox(height: 12.h), + const DividerWidget(), + SizedBox( + height: 52.h, + child: Row( + children: [ + if (showCancelBtn) ...[ + _optionButton(cancelText ?? 'Cancel', false), + Container( + width: 1.w, + height: double.infinity, + color: const Color(0xFFE5E5E5), + ), + ], + _optionButton(confirmText ?? 'Confirm', true), + ], + ), + ), + ], + ), + ), + ), + ), + ); + } + + Widget _optionButton(String label, bool isConfirm) { + return Expanded( + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + if (enableBack) Get.back(); + if (isConfirm && confirmOnTap != null) confirmOnTap!(); + }, + child: SizedBox( + height: double.infinity, + child: Center( + child: Text( + label, + textAlign: TextAlign.center, + style: TextStyle( + color: isConfirm ? Colors.black : const Color(0xFF666666), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/common/components/divider_widget.dart b/lib/common/components/divider_widget.dart new file mode 100644 index 0000000..49c96f4 --- /dev/null +++ b/lib/common/components/divider_widget.dart @@ -0,0 +1,22 @@ +// Author: fengshengxiong +// Date: 2024/5/9 +// Description: 分割线 + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class DividerWidget extends StatelessWidget { + const DividerWidget({super.key, this.height, this.color}); + + final double? height; + final Color? color; + + @override + Widget build(BuildContext context) { + return Divider( + height: height ?? 1.w, + thickness: height ?? 1.w, + color: color ?? const Color(0xFFE5E5E5), + ); + } +} diff --git a/lib/common/components/speak_alert.dart b/lib/common/components/speak_alert.dart new file mode 100644 index 0000000..c7d5ce9 --- /dev/null +++ b/lib/common/components/speak_alert.dart @@ -0,0 +1,135 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/manager/translate.dart'; +import 'package:get/get.dart'; + +class SpeakAlert extends StatelessWidget { + const SpeakAlert({ + super.key, + required this.isListening, + required this.onTap, + }); + + final Rx isListening; + final Function() onTap; + + @override + Widget build(BuildContext context) { + return Stack( + alignment: Alignment.bottomCenter, + children: [ + Positioned( + bottom: 320.w, + child: Row( + children: [ + Image.asset( + Assets.imagesRabbitEar, + width: 38.w, + height: 59.w, + ), + 4.horizontalSpace, + Image.asset( + Assets.imagesRabbitEar, + width: 38.w, + height: 59.w, + ), + ], + ), + ), + Container( + width: MediaQuery.of(context).size.width, + height: 340.w, + padding: const EdgeInsets.symmetric(horizontal: 10).w, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20.r), + topRight: Radius.circular(20.r), + ), + ), + child: Column( + children: [ + Image.asset( + Assets.imagesRabbitFace, + width: 215.w, + height: 155.w, + // color: Colors.white, + ), + 4.horizontalSpace, + Column( + children: [ + Obx(() { + return Visibility( + visible: isListening.value, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Please speak ', + style: TextStyle( + color: const Color(0xff999999), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + Flexible( + child: Text( + Translate().fromLanguageEntity.value.name, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Colors.black, + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + ), + ], + ), + ); + }), + Obx(() { + return Text( + isListening.value + ? 'I am listening, Click the button to end and translate' + : 'Click the button to start speaking', + maxLines: 2, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xff999999), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ); + }), + ], + ), + 20.verticalSpace, + ClipOval( + child: GestureDetector( + onTap: onTap, + child: Container( + width: 60.w, + height: 60.w, + color: const Color(0xff87ECB3), + child: Obx(() { + return Icon( + isListening.value ? Icons.pause : Icons.mic, + color: Colors.white, + size: 36, + ); + }), + ), + ), + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/common/components/view_state.dart b/lib/common/components/view_state.dart new file mode 100644 index 0000000..37ea48d --- /dev/null +++ b/lib/common/components/view_state.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +/// 四种视图状态 +enum ViewStateEnum { normal, error, loading, empty } + +class ViewState extends StatelessWidget { + const ViewState({ + super.key, + required this.viewStateEnum, + required this.child, + }); + + final ViewStateEnum viewStateEnum; + final Widget child; + + @override + Widget build(BuildContext context) { + switch (viewStateEnum) { + case ViewStateEnum.normal: + return child; + case ViewStateEnum.loading: + return loadingView(); + case ViewStateEnum.empty: + return emptyView(); + case ViewStateEnum.error: + return errorView(); + } + } +} + +/// 加载中视图 +Widget loadingView({ + Color? color, + Animation? valueColor, + Color? backgroundColor, + double? value, +}) { + return Center( + child: CircularProgressIndicator( + color: const Color(0xff4ECA8C), + valueColor: valueColor, + backgroundColor: backgroundColor ?? Colors.white, + value: value, + ), + ); +} + +/// 空视图 +Widget emptyView({String? msg, Color? textColor}) { + return Center( + child: Text( + msg ?? 'No data', + textAlign: TextAlign.center, + style: TextStyle( + color: textColor ?? Colors.white, + fontSize: 15.sp, + ), + ), + ); +} + +/// 错误视图 +Widget errorView({String? msg, Color? textColor}) { + return Center( + child: Text( + msg ?? 'An error occurred, please try again later', + textAlign: TextAlign.center, + style: TextStyle( + color: textColor ?? Colors.white, + fontSize: 15.sp, + ), + ), + ); +} diff --git a/lib/common/hive/history_data.dart b/lib/common/hive/history_data.dart new file mode 100644 index 0000000..a9c3036 --- /dev/null +++ b/lib/common/hive/history_data.dart @@ -0,0 +1,55 @@ +import 'package:collection/collection.dart'; +import 'package:flutter_translate/common/hive/hive.dart'; +import 'package:flutter_translate/common/utils/date_utils.dart'; +import 'package:flutter_translate/model/history_model.dart'; + +class HistoryData { + /// 私有构造函数 + HistoryData._(); + + /// 静态常量用于保存类的唯一实例 + static final HistoryData _instance = HistoryData._(); + + /// 工厂构造函数返回类的唯一实例 + factory HistoryData() { + return _instance; + } + + /// 声明盒子 + /// 注意, main函数中这个盒子已经打开, 可以进行存储操作 + final _box = getHistoryBox(); + + /// 返回所有数据 + List findAll() { + return _box.values.toList(); + } + + /// 返回分组后的所有数据 + Map> findGroup() { + // 使用 groupBy 函数进行分组 + var groupedEvents = groupBy( + findAll().reversed.toList(), + (HistoryModel event) => DateUtils.formatDateMs( + event.translationTime ?? DateUtils.getNowTimestamp(), + format: DateFormats.yMoD)); + return groupedEvents; + } + + /// 添加数据 + Future add(HistoryModel entity) async { + entity.translationTime = DateUtils.getNowTimestamp(); + return await _box.add(entity); + } + + /// 删除 + Future remove(int index) async { + await _box.deleteAt(index); + await _box.flush(); + } + + /// 清空所有数据 + Future drop() async { + await _box.clear(); + await _box.flush(); + } +} diff --git a/lib/common/hive/hive.dart b/lib/common/hive/hive.dart new file mode 100644 index 0000000..d2d4a91 --- /dev/null +++ b/lib/common/hive/hive.dart @@ -0,0 +1,23 @@ +import 'package:flutter_translate/model/history_model.dart'; +import 'package:hive_flutter/hive_flutter.dart'; + +const historyBox = 'historyBox'; +const remoteConfigBox = 'remoteConfigBox'; + +Future initHive() async { + // 初始化 + await Hive.initFlutter(); + // 注册类型适配器 + Hive.registerAdapter(HistoryEntityAdapter()); + // 打开盒子 + await Hive.openBox(historyBox); + await Hive.openBox(remoteConfigBox); +} + +Box getHistoryBox() { + return Hive.box(historyBox); +} + +Box getRemoteConfigBox() { + return Hive.box(remoteConfigBox); +} \ No newline at end of file diff --git a/lib/common/hive/remote_config_box.dart b/lib/common/hive/remote_config_box.dart new file mode 100644 index 0000000..a4028e9 --- /dev/null +++ b/lib/common/hive/remote_config_box.dart @@ -0,0 +1,56 @@ +// Author: fengshengxiong +// Date: 2024/5/8 +// Description: 远程配置数据盒子 + +import 'dart:convert'; + +import 'package:flutter_translate/common/hive/hive.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; +import 'package:flutter_translate/common/utils/obj_util.dart'; +import 'package:flutter_translate/global/app_config.dart'; + +class RemoteConfigBox { + RemoteConfigBox._(); + + static final RemoteConfigBox _instance = RemoteConfigBox._(); + + factory RemoteConfigBox() { + return _instance; + } + + /// isOpenKey + final _isOpenKey = 'isOpenKey'; + + /// 广告开关 + final _adSwitchKey = 'adSwitchKey'; + + /// 声明盒子 + /// 注意, main函数中这个盒子已经打开, 可以进行存储操作 + final _box = getRemoteConfigBox(); + + Future putIsOpen(String isOpen) async { + return await _box.put(_isOpenKey, isOpen); + } + + /// 获取远程版本 + String? getVersion() { + String? isOpen = _box.get(_isOpenKey); + String? version; + if (ObjUtil.isNotEmpty(isOpen)) { + try { + version = jsonDecode(isOpen!)['version']; + } catch (e) { + Log.d(e.toString()); + } + } + return version; + } + + Future putAdSwitch(bool adSwitch) async { + return await _box.put(_adSwitchKey, adSwitch); + } + + bool getAdSwitch() { + return _box.get(_adSwitchKey, defaultValue: adSwitch); + } +} diff --git a/lib/common/utils/bot_toast.dart b/lib/common/utils/bot_toast.dart new file mode 100644 index 0000000..2a9d351 --- /dev/null +++ b/lib/common/utils/bot_toast.dart @@ -0,0 +1,27 @@ +import 'package:bot_toast/bot_toast.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +void toast(String? value, {bool show = true}) { + if (show && value != null) { + BotToast.showText( + text: value, + align: const Alignment(0, -0.1), + contentColor: Colors.white, + textStyle: TextStyle(fontSize: 14.sp, color: Colors.black), + ); + } +} + +void loading({bool show = true}) { + if (show) { + BotToast.showLoading(); + } +} + + +void dismiss({bool dismiss = true}) { +if (dismiss) BotToast.closeAllLoading(); +} + + diff --git a/lib/common/utils/date_utils.dart b/lib/common/utils/date_utils.dart new file mode 100644 index 0000000..6094977 --- /dev/null +++ b/lib/common/utils/date_utils.dart @@ -0,0 +1,296 @@ +import 'package:intl/intl.dart'; + +class DateFormats { + static String full = 'yyyy-MM-dd HH:mm:ss'; + static String yMoDHM = 'yyyy-MM-dd HH:mm'; + static String yMoD = 'yyyy-MM-dd'; + static String yMo = 'yyyy-MM'; + static String moD = 'MM-dd'; + static String moDHM = 'MM-dd HH:mm'; + static String hMS = 'HH:mm:ss'; + static String hM = 'HH:mm'; + + static String zhFull = 'yyyy年MM月dd日 HH时mm分ss秒'; + static String zhYMoDHM = 'yyyy年MM月dd日 HH时mm分'; + static String zhYMoD = 'yyyy年MM月dd日'; + static String zhYMo = 'yyyy年MM月'; + static String zhMoD = 'MM月dd日'; + static String zhMoDHM = 'MM月dd日 HH时mm分'; + static String zhHMS = 'HH时mm分ss秒'; + static String zhHM = 'HH时mm分'; +} + +class DateUtils { + /// 月->天数. + static Map monthDay = { + 1: 31, + 2: 28, + 3: 31, + 4: 30, + 5: 31, + 6: 30, + 7: 31, + 8: 31, + 9: 30, + 10: 31, + 11: 30, + 12: 31, + }; + + /// 获取当前时间,默认格式(yyyy-MM-dd HH:mm:ss) + static String getNowTimeStr({String? format}) { + return formatDate(DateTime.now(), format: format); + } + + /// 获取当前时间戳 + static int getNowTimestamp() { + return DateTime.now().millisecondsSinceEpoch; + } + + /// 以毫秒为单位格式化日期 + static String formatDateMs(int ms, {bool isUtc = false, String? format}) { + return formatDate(getDateTimeByMs(ms, isUtc: isUtc), format: format); + } + + /// 毫秒 转 DateTime + static DateTime getDateTimeByMs(int ms, {bool isUtc = false}) { + return DateTime.fromMillisecondsSinceEpoch(ms, isUtc: isUtc); + } + + /// 日期str 转 毫秒 + static int? getDateMsByTimeStr(String dateStr, {bool? isUtc}) { + DateTime? dateTime = getDateTime(dateStr, isUtc: isUtc); + return dateTime?.millisecondsSinceEpoch; + } + + /// 按日期str格式化日期 + static String formatDateStr(String dateStr, {bool? isUtc, String? format}) { + return formatDate(getDateTime(dateStr, isUtc: isUtc), format: format); + } + + /// 日期str 转 DateTime + static DateTime? getDateTime(String dateStr, {bool? isUtc}) { + DateTime? dateTime = DateTime.tryParse(dateStr); + if (isUtc != null) { + if (isUtc) { + dateTime = dateTime?.toUtc(); + } else { + dateTime = dateTime?.toLocal(); + } + } + return dateTime; + } + + /// 按DateTime格式化日期 + /// format 转换格式(已提供常用格式 DateFormats,可以自定义格式:'yyyy/MM/dd HH:mm:ss') + /// 格式要求 + /// year -> yyyy/yy month -> MM/M day -> dd/d + /// hour -> HH/H minute -> mm/m second -> ss/s + static String formatDate(DateTime? dateTime, {String? format}) { + if (dateTime == null) return ''; + format = format ?? DateFormats.full; + if (format.contains('yy')) { + String year = dateTime.year.toString(); + if (format.contains('yyyy')) { + format = format.replaceAll('yyyy', year); + } else { + format = format.replaceAll( + 'yy', year.substring(year.length - 2, year.length)); + } + } + + format = _comFormat(dateTime.month, format, 'M', 'MM'); + format = _comFormat(dateTime.day, format, 'd', 'dd'); + format = _comFormat(dateTime.hour, format, 'H', 'HH'); + format = _comFormat(dateTime.minute, format, 'm', 'mm'); + format = _comFormat(dateTime.second, format, 's', 'ss'); + format = _comFormat(dateTime.millisecond, format, 'S', 'SSS'); + + return format; + } + + static String _comFormat(int value, String format, String single, String full) { + if (format.contains(single)) { + if (format.contains(full)) { + format = format.replaceAll(full, value < 10 ? '0$value' : value.toString()); + } else { + format = format.replaceAll(single, value.toString()); + } + } + return format; + } + + /// 工作日 + /// dateTime + /// isUtc + /// languageCode zh or en + /// short + static String getWeekday(DateTime? dateTime, {String languageCode = 'zh', bool short = false}) { + if (dateTime == null) return ''; + String weekday = ''; + switch (dateTime.weekday) { + case 1: + weekday = languageCode == 'zh' ? '星期一' : 'Monday'; + break; + case 2: + weekday = languageCode == 'zh' ? '星期二' : 'Tuesday'; + break; + case 3: + weekday = languageCode == 'zh' ? '星期三' : 'Wednesday'; + break; + case 4: + weekday = languageCode == 'zh' ? '星期四' : 'Thursday'; + break; + case 5: + weekday = languageCode == 'zh' ? '星期五' : 'Friday'; + break; + case 6: + weekday = languageCode == 'zh' ? '星期六' : 'Saturday'; + break; + case 7: + weekday = languageCode == 'zh' ? '星期日' : 'Sunday'; + break; + default: + break; + } + return languageCode == 'zh' + ? (short ? weekday.replaceAll('星期', '周') : weekday) + : weekday.substring(0, short ? 3 : weekday.length); + } + + /// 以毫秒计算工作日 + static String getWeekdayByMs(int milliseconds, {bool isUtc = false, String languageCode = 'zh', bool short = false}) { + DateTime dateTime = getDateTimeByMs(milliseconds, isUtc: isUtc); + return getWeekday(dateTime, languageCode: languageCode, short: short); + } + + /// 在今年的第几天 + static int getDayOfYear(DateTime dateTime) { + int year = dateTime.year; + int month = dateTime.month; + int days = dateTime.day; + for (int i = 1; i < month; i++) { + days = days + monthDay[i]!; + } + if (isLeapYearByYear(year) && month > 2) { + days = days + 1; + } + return days; + } + + /// 在今年的第几天 + static int getDayOfYearByMs(int ms, {bool isUtc = false}) { + return getDayOfYear(DateTime.fromMillisecondsSinceEpoch(ms, isUtc: isUtc)); + } + + /// 是否是当天 + static bool isToday(int? milliseconds, {bool isUtc = false, int? locMs}) { + if (milliseconds == null || milliseconds == 0) return false; + DateTime old = + DateTime.fromMillisecondsSinceEpoch(milliseconds, isUtc: isUtc); + DateTime now; + if (locMs != null) { + now = DateUtils.getDateTimeByMs(locMs); + } else { + now = isUtc ? DateTime.now().toUtc() : DateTime.now().toLocal(); + } + return old.year == now.year && old.month == now.month && old.day == now.day; + } + + /// 是否是昨天. + static bool isYesterday(DateTime dateTime, DateTime locDateTime) { + if (yearIsEqual(dateTime, locDateTime)) { + int spDay = getDayOfYear(locDateTime) - getDayOfYear(dateTime); + return spDay == 1; + } else { + return ((locDateTime.year - dateTime.year == 1) && + dateTime.month == 12 && + locDateTime.month == 1 && + dateTime.day == 31 && + locDateTime.day == 1); + } + } + + /// 是否是昨天 + static bool isYesterdayByMs(int ms, int locMs) { + return isYesterday(DateTime.fromMillisecondsSinceEpoch(ms), + DateTime.fromMillisecondsSinceEpoch(locMs)); + } + + /// 是否是本周 + static bool isWeek(int? ms, {bool isUtc = false, int? locMs}) { + if (ms == null || ms <= 0) { + return false; + } + DateTime oldT = DateTime.fromMillisecondsSinceEpoch(ms, isUtc: isUtc); + DateTime nowT; + if (locMs != null) { + nowT = DateUtils.getDateTimeByMs(locMs, isUtc: isUtc); + } else { + nowT = isUtc ? DateTime.now().toUtc() : DateTime.now().toLocal(); + } + + DateTime old = + nowT.millisecondsSinceEpoch > oldT.millisecondsSinceEpoch ? oldT : nowT; + DateTime now = + nowT.millisecondsSinceEpoch > oldT.millisecondsSinceEpoch ? nowT : oldT; + return (now.weekday >= old.weekday) && + (now.millisecondsSinceEpoch - old.millisecondsSinceEpoch <= + 7 * 24 * 60 * 60 * 1000); + } + + /// 是否同年 + static bool yearIsEqual(DateTime dateTime, DateTime locDateTime) { + return dateTime.year == locDateTime.year; + } + + /// 是否同年 + static bool yearIsEqualByMs(int ms, int locMs) { + return yearIsEqual(DateTime.fromMillisecondsSinceEpoch(ms), + DateTime.fromMillisecondsSinceEpoch(locMs)); + } + + /// 是否是闰年 + static bool isLeapYear(DateTime dateTime) { + return isLeapYearByYear(dateTime.year); + } + + /// 是否是闰年 + static bool isLeapYearByYear(int year) { + return year % 4 == 0 && year % 100 != 0 || year % 400 == 0; + } + + /// 判断两个 DateTime 是否是同一天 + static bool isSameDay(String date1, String date2) { + final dateTime1 = getDateTime(date1); + final dateTime2 = getDateTime(date2); + if(dateTime1?.year == dateTime2?.year && dateTime1?.month == dateTime2?.month && dateTime1?.day == dateTime2?.day) { + return true; + } + return false; + } + + /// 如果如果当前月是12,下月年份需要+1 + static int getNextMonthToYear() { + DateTime dateTime = DateTime.now(); + if(dateTime.month == 12) { + return dateTime.year + 1; + } + return dateTime.year; + } + + /// 获取当前下月 + static int getNextMonth() { + DateTime dateTime = DateTime.now(); + if (dateTime.month == 12) { + return 1; + } + return dateTime.month + 1; + } + + static stringToYyMmDd(String date) { + DateTime sourceDate = DateTime.parse(date); + String formatDate = DateFormat("yyyy-MM-dd").format(sourceDate); + return formatDate; + } +} \ No newline at end of file diff --git a/lib/common/utils/log_utils.dart b/lib/common/utils/log_utils.dart new file mode 100644 index 0000000..1bdf3e3 --- /dev/null +++ b/lib/common/utils/log_utils.dart @@ -0,0 +1,24 @@ +import 'package:logger/logger.dart'; + +final _logger = Logger( + printer: PrettyPrinter( + // 要显示的方法调用的数量 + methodCount: 0, + // 如果提供了stacktrace,则方法调用的数量 + errorMethodCount: 8, + // 输出的宽度 + lineLength: 120, + // 丰富多彩的日志消息 + colors: true, + // 是否打印表情符号 + printEmojis: true, + ), +); + +class Log { + static const String _tag = 'Log'; + + Log.d(dynamic msg, {String tag = _tag}) { + _logger.d('[$tag]: $msg'); + } +} \ No newline at end of file diff --git a/lib/common/utils/number_utils.dart b/lib/common/utils/number_utils.dart new file mode 100644 index 0000000..1e9fd2c --- /dev/null +++ b/lib/common/utils/number_utils.dart @@ -0,0 +1,19 @@ +import 'dart:math'; + +class NumberUtils { + /// 获取一个随机随 + static int getRandomNumber(int min, int max) { + Random random = Random(); + int randomNumber = random.nextInt(max - min) + min; + return randomNumber; + } + + /// 获取不包括当前的随机数 + static int getRandomNumberExcludingCurrent(int min, int max, int current) { + int newNumber; + do { + newNumber = getRandomNumber(min, max); + } while (newNumber == current); + return newNumber; + } +} diff --git a/lib/common/utils/obj_util.dart b/lib/common/utils/obj_util.dart new file mode 100644 index 0000000..23cce01 --- /dev/null +++ b/lib/common/utils/obj_util.dart @@ -0,0 +1,47 @@ +// Author: fengshengxiong +// Date: 2024/5/7 +// Description: 对象工具类 + +class ObjUtil { + static String getStr(String? str) { + return isNotEmpty(str) ? str! : ''; + } + + static bool isNotEmptyList(Iterable? list) { + return list != null && list.isNotEmpty; + } + + static bool isNotEmptyMap(Map? map) { + return map != null && map.isNotEmpty; + } + + static bool isNotEmpty(Object? object) { + return !isEmpty(object); + } + + static bool isEmpty(Object? object) { + if (object == null) return true; + if (object is String && object.trim().isEmpty) { + return true; + } else if (object is Iterable && object.isEmpty) { + return true; + } else if (object is Map && object.isEmpty) { + return true; + } + return false; + } + + /// Returns true Two List Is Equal. + static bool twoListIsEqual(List? listA, List? listB) { + if (listA == listB) return true; + if (listA == null || listB == null) return false; + int length = listA.length; + if (length != listB.length) return false; + for (int i = 0; i < length; i++) { + if (!listA.contains(listB[i])) { + return false; + } + } + return true; + } +} \ No newline at end of file diff --git a/lib/common/utils/object_utils.dart b/lib/common/utils/object_utils.dart new file mode 100644 index 0000000..2afc4fa --- /dev/null +++ b/lib/common/utils/object_utils.dart @@ -0,0 +1,47 @@ +class ObjectUtils { + static bool isNotEmptyStr(String? str) { + return str != null && str.trim().isNotEmpty; + } + + static String getStr(String? str) { + return isNotEmptyStr(str) ? str! : ''; + } + + static bool isNotEmptyList(Iterable? list) { + return list != null && list.isNotEmpty; + } + + static bool isNotEmptyMap(Map? map) { + return map != null && map.isNotEmpty; + } + + static bool isEmpty(Object? object) { + if (object == null) return true; + if (object is String && object.trim().isEmpty) { + return true; + } else if (object is Iterable && object.isEmpty) { + return true; + } else if (object is Map && object.isEmpty) { + return true; + } + return false; + } + + static bool isNotEmpty(Object? object) { + return !isEmpty(object); + } + + /// Returns true Two List Is Equal. + static bool twoListIsEqual(List? listA, List? listB) { + if (listA == listB) return true; + if (listA == null || listB == null) return false; + int length = listA.length; + if (length != listB.length) return false; + for (int i = 0; i < length; i++) { + if (!listA.contains(listB[i])) { + return false; + } + } + return true; + } +} diff --git a/lib/common/utils/permission_utils.dart b/lib/common/utils/permission_utils.dart new file mode 100644 index 0000000..0cde390 --- /dev/null +++ b/lib/common/utils/permission_utils.dart @@ -0,0 +1,190 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class PermissionUtils { + /// 检测是否有权限 + /// [permissionList] 权限申请列表 + static Future checkPermission(List permissionList, + {bool showDialog = true}) async { + // 一个新待申请权限列表 + List newPermissionList = []; + // 遍历当前权限申请列表 + for (Permission permission in permissionList) { + PermissionStatus status = await permission.status; + // 如果不是允许状态就添加到新的申请列表中 + if (!status.isGranted) { + newPermissionList.add(permission); + } + } + + // 如果需要重新申请的列表不是空的 + if (newPermissionList.isNotEmpty) { + PermissionStatus permissionStatus = + await _requestPermission(newPermissionList); + switch (permissionStatus) { + // 拒绝状态 + case PermissionStatus.denied: + if (showDialog) _showFailedDialog(newPermissionList); + return false; + // 允许状态 + case PermissionStatus.granted: + case PermissionStatus.limited: + return true; + // 永久拒绝 + case PermissionStatus.provisional: + case PermissionStatus.restricted: + case PermissionStatus.permanentlyDenied: + if (showDialog) { + _showFailedDialog(newPermissionList, isPermanentlyDenied: true); + } + break; + } + } else { + return true; + } + return false; + } + + /// 获取新列表中的权限 如果有一项不合格就返回false + static Future _requestPermission( + List permissionList) async { + Map statuses = await permissionList.request(); + PermissionStatus currentPermissionStatus = PermissionStatus.granted; + statuses.forEach((key, value) { + if (!value.isGranted || !value.isLimited) { + currentPermissionStatus = value; + return; + } + }); + return currentPermissionStatus; + } + + /// 请求位置权限 + static Future checkLocationAlways() async { + // 获取前置状态 + // Android没有这一步 ios会先访问这个再访问其他的 + PermissionStatus status1 = PermissionStatus.granted; + status1 = await _checkSinglePermission(Permission.locationWhenInUse); + + // 获取第二个状态 + PermissionStatus status2 = PermissionStatus.denied; + + // 如果前置状态为成功才能执行获取第二个状态 + if (status1.isGranted) { + status2 = await _checkSinglePermission(Permission.locationAlways); + } + + // 如果两个都成功那么就返回成功 + if (status1.isGranted && status2.isGranted) { + return true; + } else { + // 如果有一个拒绝那么就失败了 + _showFailedDialog( + [Permission.locationWhenInUse, Permission.locationAlways], + isPermanentlyDenied: Platform.isIOS ? true : false, + ); + } + return false; + } + + /// 请求单个权限 + static _checkSinglePermission(Permission permission) async { + // 获取当前状态 + PermissionStatus status = await permission.status; + PermissionStatus currentPermissionStatus = PermissionStatus.granted; + // 如果它状态不是允许那么就去获取 + if (!status.isGranted) { + currentPermissionStatus = await _requestPermission([permission]); + } + // 返回最终状态 + return currentPermissionStatus; + } + + /// 权限拒绝后弹窗 + static _showFailedDialog( + List permissionList, { + bool isPermanentlyDenied = false, + }) async { + Get.dialog( + barrierDismissible: false, + CupertinoAlertDialog( + title: Text( + "Reminder", + style: TextStyle( + color: Colors.black, + fontSize: 18.sp, + fontWeight: FontWeight.w600, + ), + ), + content: Text( + await _getDescription(permissionList), + style: TextStyle( + color: const Color(0xFF333333), + fontSize: 14.sp, + ), + ), + actions: [ + CupertinoDialogAction( + onPressed: Get.back, + textStyle: TextStyle( + color: const Color(0xFF666666), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + child: const Text('Cancel'), + ), + CupertinoDialogAction( + onPressed: () { + if (isPermanentlyDenied) { + openAppSettings(); + } else { + checkPermission(permissionList); + } + }, + textStyle: TextStyle( + color: Colors.black, + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + child: Text(isPermanentlyDenied ? 'Go open' : 'Confirm'), + ), + ], + ), + ); + } + + /// 获取权限描述 + static Future _getDescription(List permissionList) async { + late Permission failedPermission; + for (Permission permission in permissionList) { + if (!await permission.status.isGranted) { + failedPermission = permission; + break; + } + } + + String description = ''; + if (failedPermission == Permission.camera) { + description = + 'This will enable you to take photos and recognize text within them for translation.'; + } else if (failedPermission == Permission.photos) { + description = + 'This will enable you to select photos from your library for text recognition and translation.'; + } else if (failedPermission == Permission.microphone) { + description = + 'This will enable you to input content through voice for recognition and translation.'; + } else if (failedPermission == Permission.speech) { + description = + 'This will enable you to use speech recognition to convert voice content to text for translation.'; + } else if (failedPermission == Permission.appTrackingTransparency) { + description = + 'This will help us provide a more personalized advertising experience. Your data privacy will be protected.'; + } + return description; + } +} diff --git a/lib/common/utils/shared_util.dart b/lib/common/utils/shared_util.dart new file mode 100644 index 0000000..e6d7eb8 --- /dev/null +++ b/lib/common/utils/shared_util.dart @@ -0,0 +1,80 @@ +import 'dart:convert'; + +import 'package:shared_preferences/shared_preferences.dart'; + +class SharedUtil { + SharedPreferences? _prefs; + static SharedUtil? _instance; + + SharedUtil.of() { + init(); + } + SharedUtil._pre(SharedPreferences prefs) { + _prefs = prefs; + } + + static SharedUtil getInstance() { + _instance ??= SharedUtil.of(); + return _instance!; + } + + void init() async { + _prefs ??= await SharedPreferences.getInstance(); + } + + static Future initShared() async { + if (_instance == null) { + var prefs = await SharedPreferences.getInstance(); + _instance = SharedUtil._pre(prefs); + } + return _instance!; + } + + void setData(String key, T data) { + if (data is String) { + _prefs?.setString(key, data); + } else if (data is double) { + _prefs?.setDouble(key, data); + } else if (data is int) { + _prefs?.setInt(key, data); + } else if (data is bool) { + _prefs?.setBool(key, data); + } else if (data is List) { + _prefs?.setStringList(key, data); + } + } + + void setJson(key, value) { + value = jsonEncode(value); + _prefs?.setString(key, value); + } + + Map? getJson(key) { + String? result = _prefs?.getString(key); + if (result != null) { + return jsonDecode(result); + } + return null; + } + + void remove(String key) { + _prefs?.remove(key); + } + + T? get(String key) { + var value = _prefs?.get(key); + if (value != null) { + return value as T; + } + return null; + } + + List getStringList(String key) { + var value = _prefs?.getStringList(key); + if (value != null) { + return value; + } + return []; + } +} + diff --git a/lib/facebook/facebook_manager.dart b/lib/facebook/facebook_manager.dart new file mode 100644 index 0000000..53764d3 --- /dev/null +++ b/lib/facebook/facebook_manager.dart @@ -0,0 +1,17 @@ +// Author: fengshengxiong +// Date: 2024/6/26 +// Description: facebook管理 + +import 'package:facebook_app_events/facebook_app_events.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; + +class FacebookManager { + static Future init() async { + try { + await FacebookAppEvents().setAdvertiserTracking(enabled: true); + await FacebookAppEvents().setAutoLogAppEventsEnabled(true); + } catch (e) { + Log.d(e.toString()); + } + } +} \ No newline at end of file diff --git a/lib/firebase/firebase_analytics_manager.dart b/lib/firebase/firebase_analytics_manager.dart new file mode 100644 index 0000000..2ec28b9 --- /dev/null +++ b/lib/firebase/firebase_analytics_manager.dart @@ -0,0 +1,42 @@ +// Author: fengshengxiong +// Date: 2024/6/26 +// Description: firebase_analytics管理 + +import 'package:firebase_analytics/firebase_analytics.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; + +class FirebaseAnalyticsManager { + /// 埋点 + /// name:事件名 + /// parameters:业务参数 + static void logEvent(String eventName, {Map? parameters}) { + try { + FirebaseAnalytics.instance.logEvent( + name: eventName, + parameters: parameters, + ); + } catch (e) { + Log.d(e.toString()); + } + } + + /// 启动事件:启动时上传 + static void logLaunch() { + logEvent('launch'); + } + + /// 首页PV:首页曝光上传 + static void logHomepage() { + logEvent('homepage'); + } + + /// 加载页PV:加载页面曝光上传 + static void logLoadingPage() { + logEvent('loading_page'); + } + + /// 广告展示:所有的广告位只要有广告成功展示出来就上传一条 + static void logAdsShow() { + logEvent('ads_show'); + } +} diff --git a/lib/firebase/firebase_crashlytics_manager.dart b/lib/firebase/firebase_crashlytics_manager.dart new file mode 100644 index 0000000..1cd0f9d --- /dev/null +++ b/lib/firebase/firebase_crashlytics_manager.dart @@ -0,0 +1,28 @@ +// Author: fengshengxiong +// Date: 2024/6/26 +// Description: firebase_crashlytics管理 + +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; + +class FirebaseCrashlyticsManager { + static Future setEnabled() async { + await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(kReleaseMode); + } + + static void recordFlutterError() { + FlutterError.onError = (errorDetails) { + Log.d(errorDetails.exception); + FirebaseCrashlytics.instance.recordFlutterError(errorDetails); + }; + } + + static void recordError() { + PlatformDispatcher.instance.onError = (error, stack) { + Log.d(error); + FirebaseCrashlytics.instance.recordError(error, stack); + return true; + }; + } +} diff --git a/lib/firebase/firebase_options.dart b/lib/firebase/firebase_options.dart new file mode 100644 index 0000000..9a5a67f --- /dev/null +++ b/lib/firebase/firebase_options.dart @@ -0,0 +1,69 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for web - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions android = FirebaseOptions( + apiKey: '', + appId: '', + messagingSenderId: '', + projectId: '', + storageBucket: '', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyC-bw0H4PPLNUVBMJb4KVlg_Co_fomvX8c', + appId: '1:681504526197:ios:bb5142cc7e70d8fe118d3c', + messagingSenderId: '681504526197', + projectId: 'transease-226ba', + storageBucket: 'transease-226ba.appspot.com', + iosBundleId: 'com.translation.text.easy', + ); + +} \ No newline at end of file diff --git a/lib/firebase/firebase_remote_config_manager.dart b/lib/firebase/firebase_remote_config_manager.dart new file mode 100644 index 0000000..49dcb18 --- /dev/null +++ b/lib/firebase/firebase_remote_config_manager.dart @@ -0,0 +1,44 @@ +// Author: fengshengxiong +// Date: 2024/6/26 +// Description: firebase_remote_config管理 + +import 'package:firebase_remote_config/firebase_remote_config.dart'; +import 'package:flutter_translate/ads/interstitial_ad_manage.dart'; +import 'package:flutter_translate/common/hive/remote_config_box.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; +import 'package:flutter_translate/common/utils/obj_util.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +class FirebaseRemoteConfigManager { + static Future getAll() async { + try { + final remoteConfig = FirebaseRemoteConfig.instance; + await remoteConfig.setConfigSettings(RemoteConfigSettings( + fetchTimeout: const Duration(seconds: 15), + minimumFetchInterval: Duration.zero, + )); + bool result = await remoteConfig.fetchAndActivate(); + if (result) { + Map allData = remoteConfig.getAll(); + if (allData.isEmpty) { + Log.d('远程配置为空'); + return; + } + Log.d('远程配置获取成功'); + // 获取 isopen + var isOpen = allData['isopen']?.asString(); + if (ObjUtil.isNotEmpty(isOpen)) { + await RemoteConfigBox().putIsOpen(isOpen!); + + final packageInfo = await PackageInfo.fromPlatform(); + if (RemoteConfigBox().getVersion() != packageInfo.version) { + await RemoteConfigBox().putAdSwitch(true); + InterstitialAdManager().loadAllAd(); + } + } + } + } catch (e) { + Log.d(e.toString()); + } + } +} diff --git a/lib/generated/assets.dart b/lib/generated/assets.dart new file mode 100644 index 0000000..836dd21 --- /dev/null +++ b/lib/generated/assets.dart @@ -0,0 +1,44 @@ +///This file is automatically generated. DO NOT EDIT, all your changes would be lost. +class Assets { + Assets._(); + + static const String gifEmptyState = 'assets/gif/empty_state.gif'; + static const String gifSettingSubscript = 'assets/gif/setting_subscript.gif'; + static const String gifSubscript = 'assets/gif/subscript.gif'; + static const String iconArrowBottom = 'assets/icon/arrow_bottom.png'; + static const String iconArrowRight = 'assets/icon/arrow_right.png'; + static const String iconBack = 'assets/icon/back.png'; + static const String iconConvert = 'assets/icon/convert.png'; + static const String iconCopy = 'assets/icon/copy.png'; + static const String iconDelete = 'assets/icon/delete.png'; + static const String iconFullScreen = 'assets/icon/full_screen.png'; + static const String iconHomeMicrophone = 'assets/icon/home_microphone.png'; + static const String iconHomeTitleMore = 'assets/icon/home_title_more.png'; + static const String iconMicrophone = 'assets/icon/microphone.png'; + static const String iconRotate = 'assets/icon/rotate.png'; + static const String iconSelected = 'assets/icon/selected.png'; + static const String iconSpeaker = 'assets/icon/speaker.png'; + static const String iconStarGreen = 'assets/icon/star_green.png'; + static const String iconTools = 'assets/icon/tools.png'; + static const String iconToolsDialog = 'assets/icon/tools_dialog.png'; + static const String iconToolsHistory = 'assets/icon/tools_history.png'; + static const String iconToolsPhoto = 'assets/icon/tools_photo.png'; + static const String imagesDailyQuoteDinning = 'assets/images/daily_quote_dinning.png'; + static const String imagesDailyQuoteFamily = 'assets/images/daily_quote_family.png'; + static const String imagesDailyQuoteGreetings = 'assets/images/daily_quote_greetings.png'; + static const String imagesDailyQuoteHealthy = 'assets/images/daily_quote_healthy.png'; + static const String imagesDailyQuoteMakeFriends = 'assets/images/daily_quote_make_friends.png'; + static const String imagesDailyQuoteShopping = 'assets/images/daily_quote_shopping.png'; + static const String imagesDailyQuoteStudy = 'assets/images/daily_quote_study.png'; + static const String imagesDailyQuoteTransportation = 'assets/images/daily_quote_transportation.png'; + static const String imagesDailyQuoteTravel = 'assets/images/daily_quote_travel.png'; + static const String imagesDailyQuoteWork = 'assets/images/daily_quote_work.png'; + static const String imagesLaunchImage = 'assets/images/launch_image.png'; + static const String imagesRabbitEar = 'assets/images/rabbit_ear.png'; + static const String imagesRabbitFace = 'assets/images/rabbit_face.png'; + static const String imagesSuspendedDecoration = 'assets/images/suspended_decoration.png'; + static const String jsonLanguage = 'assets/json/language.json'; + static const String jsonScene = 'assets/json/scene.json'; + static const String launcherIcon = 'assets/launcher/icon.png'; + +} diff --git a/lib/global/app_config.dart b/lib/global/app_config.dart new file mode 100644 index 0000000..67cd2a6 --- /dev/null +++ b/lib/global/app_config.dart @@ -0,0 +1,16 @@ +import 'package:flutter_translate/common/utils/date_utils.dart'; + +const appName = 'Easy translation'; + +/// 广告开关,默认关 +const adSwitch = false; + +/// 保底逻辑:本地设定截止日期(提交日期+3天,网络时间超过,则默认展示所有广告) +DateTime getGuaranteedDate () { + DateTime? commitDate = DateUtils.getDateTime('2024-08-15 18:00:00'); + if (commitDate != null) { + return commitDate.add(const Duration(days: 3)); + } else { + return DateTime.now(); + } +} \ No newline at end of file diff --git a/lib/global/app_general.dart b/lib/global/app_general.dart new file mode 100644 index 0000000..e8d6d74 --- /dev/null +++ b/lib/global/app_general.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; + +const divider = Divider( + height: 1, + thickness: 1, + color: Color(0xff949494), +); diff --git a/lib/global/app_lifecycle_reactor.dart b/lib/global/app_lifecycle_reactor.dart new file mode 100644 index 0000000..3489a86 --- /dev/null +++ b/lib/global/app_lifecycle_reactor.dart @@ -0,0 +1,87 @@ +// Author: fengshengxiong +// Date: 2024/6/25 +// Description: 应用程序生命周期反应器 + +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter_translate/ads/interstitial_ad_manage.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; + +class AppLifecycleReactor { + AppLifecycleReactor._(); + + static final AppLifecycleReactor _instance = AppLifecycleReactor._(); + + factory AppLifecycleReactor() { + return _instance; + } + + AppLifecycleListener? appLifecycleListener; + + void listenToAppStateChanges() { + appLifecycleListener = AppLifecycleListener( + onStateChange: onStateChange, + onResume: onResume, + onInactive: onInactive, + onHide: onHide, + onShow: onShow, + onPause: onPause, + onRestart: onRestart, + onDetach: onDetach, + onExitRequested: onExitRequested, + ); + } + + /// 监听状态 + onStateChange(AppLifecycleState state) { + Log.d('app_state:$state'); + } + + /// 可见,并且可以响应用户操作时的回调 + /// 比如应用从后台调度到前台时,在 onShow() 后面 执行 + /// 注意:这个回调,初始化时 不执行 + onResume() { + Log.d('---onResume'); + } + + /// 可见,但无法响应用户操作时的回调 + onInactive() { + Log.d('---onInactive'); + } + + /// 隐藏时的回调 + onHide() { + Log.d('---onHide'); + } + + /// 显示时的回调,应用从后台调度到前台时 + onShow() { + Log.d('---onShow'); + InterstitialAdManager().showAdIfReady(InterstitialAdManager().adIds[0]); + } + + /// 暂停时的回调 + onPause() { + Log.d('---onPause'); + } + + /// 暂停后恢复时的回调 + onRestart() { + Log.d('---onRestart'); + } + + /// 这两个回调,不是所有平台都支持, + + /// 当退出 并将所有视图与引擎分离时的回调(IOS 支持,Android 不支持) + onDetach() { + Log.d('---onDetach'); + } + + /// 在退出程序时,发出询问的回调(IOS、Android 都不支持) + /// 响应 [AppExitResponse.exit] 将继续终止,响应 [AppExitResponse.cancel] 将取消终止。 + Future onExitRequested() async { + Log.d('---onExitRequested'); + return AppExitResponse.exit; + } +} \ No newline at end of file diff --git a/lib/global/app_themes.dart b/lib/global/app_themes.dart new file mode 100644 index 0000000..5ec9585 --- /dev/null +++ b/lib/global/app_themes.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_translate/global/app_config.dart'; + +ThemeData lightTheme = ThemeData.light(useMaterial3: true).copyWith( + textSelectionTheme: const TextSelectionThemeData( + cursorColor: Colors.lightBlueAccent, + ), + brightness: Brightness.light, + splashColor: Colors.transparent, + highlightColor: Colors.transparent, + colorScheme: ColorScheme.fromSeed( + seedColor: const Color.fromARGB(255, 185, 239, 200), + primary: Colors.lightBlueAccent, + ), + scaffoldBackgroundColor: Colors.white, +); diff --git a/lib/global/app_tracking_transparency_manager.dart b/lib/global/app_tracking_transparency_manager.dart new file mode 100644 index 0000000..0cf22cb --- /dev/null +++ b/lib/global/app_tracking_transparency_manager.dart @@ -0,0 +1,51 @@ +// Author: fengshengxiong +// Date: 2024/6/26 +// Description: 应用程序跟踪透明度管理器 + +import 'dart:async'; +import 'dart:io'; + +import 'package:app_tracking_transparency/app_tracking_transparency.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; + +class AppTrackingTransparencyManager { + AppTrackingTransparencyManager._(); + + static final AppTrackingTransparencyManager _instance = AppTrackingTransparencyManager._(); + + factory AppTrackingTransparencyManager() { + return _instance; + } + + Timer? _timer; + + /// 请求跟踪授权 + Future requestATT() async { + if (Platform.isIOS) { + final TrackingStatus status = await AppTrackingTransparency.trackingAuthorizationStatus; + if (status == TrackingStatus.notDetermined) { + if (_timer != null && _timer!.isActive) { + final TrackingStatus status = await AppTrackingTransparency.requestTrackingAuthorization(); + Log.d('跟踪授权状态: $status'); + } else { + _startTimer(); + } + } else { + _stopTimer(); + } + } + } + + /// 开始定时器 + void _startTimer() { + _timer = Timer.periodic(const Duration(seconds: 3), (Timer t) { + requestATT(); + }); + } + + /// 停止定时器 + void _stopTimer() { + _timer?.cancel(); + _timer = null; + } +} diff --git a/lib/global/network_connectivity_service.dart b/lib/global/network_connectivity_service.dart new file mode 100644 index 0000000..897abfe --- /dev/null +++ b/lib/global/network_connectivity_service.dart @@ -0,0 +1,69 @@ +// Author: fengshengxiong +// Date: 2024/6/26 +// Description: 网络连接服务 + +import 'dart:async'; + +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter_translate/ads/interstitial_ad_manage.dart'; +import 'package:flutter_translate/common/components/dialog/remind_dialog.dart'; +import 'package:flutter_translate/common/hive/remote_config_box.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; +import 'package:flutter_translate/firebase/firebase_remote_config_manager.dart'; +import 'package:flutter_translate/pages/launch/launch_controller.dart'; +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class NetworkConnectivityService extends GetxService { + StreamSubscription>? subscription; + var isShowNetworkDialog = false; + + @override + void onInit() { + super.onInit(); + subscription = Connectivity().onConnectivityChanged.listen((List result) async { + Log.d('当前网络连接类型:$result'); + if (result.contains(ConnectivityResult.none)) { + _checkNetworkDialog(); + isShowNetworkDialog = true; + } else { + if (Get.isRegistered()) { + if (LaunchController.to.timer == null) { + LaunchController.to.startTimer(); + } + } + Log.d('检查网络弹窗状态:${Get.isDialogOpen}'); + if (Get.isDialogOpen != null && Get.isDialogOpen! && isShowNetworkDialog) { + Get.back(); + isShowNetworkDialog = false; + } + bool adSwitch = RemoteConfigBox().getAdSwitch(); + if (adSwitch) { + InterstitialAdManager().loadAllAd(); + } else { + await FirebaseRemoteConfigManager.getAll(); + } + } + }); + } + + @override + void onClose() { + subscription?.cancel(); + super.onClose(); + } + + void _checkNetworkDialog() { + Get.dialog( + barrierDismissible: false, + RemindDialog( + content: 'No network connection\nPlease check the current network', + showCancelBtn: false, + enableBack: false, + confirmOnTap: () { + openAppSettings(); + }, + ), + ); + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..71fa4b4 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,97 @@ +import 'package:bot_toast/bot_toast.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/ads/interstitial_ad_manage.dart'; +import 'package:flutter_translate/common/hive/hive.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; +import 'package:flutter_translate/common/utils/shared_util.dart'; +import 'package:flutter_translate/facebook/facebook_manager.dart'; +import 'package:flutter_translate/firebase/firebase_analytics_manager.dart'; +import 'package:flutter_translate/firebase/firebase_crashlytics_manager.dart'; +import 'package:flutter_translate/firebase/firebase_options.dart'; +import 'package:flutter_translate/global/app_themes.dart'; +import 'package:flutter_translate/manager/att.dart'; +import 'package:flutter_translate/manager/translate.dart'; +import 'package:flutter_translate/manager/tts.dart'; +import 'package:flutter_translate/router/get_gages.dart'; +import 'package:get/get.dart'; + +import 'global/app_config.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + + await initHive(); + + // 初始化Firebase + try { + await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); + await FirebaseCrashlyticsManager.setEnabled(); + FirebaseCrashlyticsManager.recordFlutterError(); + FirebaseCrashlyticsManager.recordError(); + FirebaseAnalyticsManager.logLaunch(); + } catch (e) { + Log.d("Firebase initialization error: $e"); + } + + await FacebookManager.init(); + + await InterstitialAdManager().init(); + + SharedUtil.initShared(); + + await Translate().init(); + await Tts().init(); + + Att().attRequest(); + + // 竖屏 + SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + DeviceOrientation.portraitDown, + ]); + + runApp(const App()); +} + +class App extends StatelessWidget { + const App({super.key}); + + @override + Widget build(BuildContext context) { + return ScreenUtilInit( + designSize: const Size(375, 812), + minTextAdapt: true, + builder: (context, child) { + final botToastBuilder = BotToastInit(); + return KeyboardDismissOnTap( + child: GetMaterialApp( + debugShowCheckedModeBanner: false, + title: appName, + theme: lightTheme, + themeMode: ThemeMode.light, + initialRoute: GetPages.launch, + getPages: GetPages.routers, + builder: (context, widget) { + widget = botToastBuilder(context, widget); + // 设置文字大小不随系统设置改变 + return MediaQuery.withNoTextScaling(child: widget); + }, + routingCallback: (routing) { + Log.d("当前路由 => ${routing?.current}"); + if (routing?.current == GetPages.launch) { + FirebaseAnalyticsManager.logLoadingPage(); + } + if (routing?.current == GetPages.home) { + FirebaseAnalyticsManager.logHomepage(); + } + }, + ), + ); + }, + ); + } +} diff --git a/lib/manager/att.dart b/lib/manager/att.dart new file mode 100644 index 0000000..85c3cd7 --- /dev/null +++ b/lib/manager/att.dart @@ -0,0 +1,48 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:app_tracking_transparency/app_tracking_transparency.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; + +class Att { + Att._(); + + static final Att _instance = Att._(); + + factory Att() { + return _instance; + } + + Timer? _timer; + + /// 请求跟踪授权 + Future attRequest() async { + if (Platform.isIOS) { + final TrackingStatus status = + await AppTrackingTransparency.trackingAuthorizationStatus; + if (status == TrackingStatus.notDetermined) { + if (_timer != null && _timer!.isActive) { + await AppTrackingTransparency.requestTrackingAuthorization() + .then((status) => Log.d('跟踪授权状态: $status')); + } else { + _startTimer(); + } + } else { + _stopTimer(); + } + } + } + + /// 开始定时器 + void _startTimer() { + _timer = Timer.periodic(const Duration(seconds: 3), (Timer t) { + attRequest(); + }); + } + + /// 停止定时器 + void _stopTimer() { + _timer?.cancel(); + _timer = null; + } +} diff --git a/lib/manager/speech_convert.dart b/lib/manager/speech_convert.dart new file mode 100644 index 0000000..8d6b683 --- /dev/null +++ b/lib/manager/speech_convert.dart @@ -0,0 +1,80 @@ +import 'package:flutter_translate/common/utils/bot_toast.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; +import 'package:get/get.dart'; +import 'package:speech_to_text/speech_recognition_error.dart'; +import 'package:speech_to_text/speech_to_text.dart'; + +class SpeechConvert { + static final SpeechConvert _instance = SpeechConvert._(); + + SpeechConvert._(); + + factory SpeechConvert() { + return _instance; + } + + final _speechToText = SpeechToText(); + + var isListening = false.obs; + var hasSpeech = false; + + Future init() async { + try { + loading(); + hasSpeech = await _speechToText.initialize( + onStatus: _statusListener, + onError: _errorListener, + ); + dismiss(); + _speechToText.statusListener ??= _statusListener; + _speechToText.errorListener ??= _errorListener; + } catch (e) { + Log.d('Speech recognition failed: ${e.toString()}'); + } + } + + Future start(String localeId, SpeechResultListener onResult) async { + loading(); + try { + await _speechToText.listen( + onResult: onResult, + localeId: localeId, + listenFor: const Duration(minutes: 30), + pauseFor: const Duration(minutes: 3), + listenOptions: SpeechListenOptions( + cancelOnError: true, + autoPunctuation: true, + listenMode: ListenMode.dictation, + ), + ); + dismiss(); + } catch (e) { + if (e.runtimeType == ListenFailedException) { + Log.d('speechToText.listen:${(e as ListenFailedException).message}'); + } else { + Log.d('speechToText.listen:${e.toString()}'); + } + toast('The current language does not support speech recognition'); + } + } + + void _statusListener(String status) { + Log.d('状态:$status'); + isListening.value = status == 'listening'; + } + + void _errorListener(SpeechRecognitionError error) { + Log.d( + 'Received error status: $error, listening: ${_speechToText.isListening}', + ); + toast('Speech recognition failed: ${error.errorMsg}'); + } + + Future stop({bool? showLoading}) async { + if (isListening.value) { + loading(show: showLoading??true); + await _speechToText.stop(); + dismiss(); + } + } +} diff --git a/lib/manager/translate.dart b/lib/manager/translate.dart new file mode 100644 index 0000000..4169600 --- /dev/null +++ b/lib/manager/translate.dart @@ -0,0 +1,114 @@ +import 'dart:convert'; +import 'dart:math'; +import 'dart:ui'; + +import 'package:devicelocale/devicelocale.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_translate/common/components/common_language_selector.dart'; +import 'package:flutter_translate/common/utils/number_utils.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/model/language_model.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:get/get.dart'; + +class Translate { + Translate._(); + + factory Translate() { + return _instance; + } + + static final Translate _instance = Translate._(); + + /// 支持翻译的所有语言 + var languageList = [].obs; + + /// 是否选择的源语言 + var isSelectFromLanguage = true.obs; + + /// 源语言 + var fromLanguageEntity = LanguageModel( + code: 'zh-cn', + name: 'Chinese (Simplified)', + ).obs; + + /// 目标语言 + var toLanguageEntity = LanguageModel( + code: 'en', + name: 'English', + ).obs; + + Future init() async { + var data = jsonDecode(await rootBundle.loadString(Assets.jsonLanguage)); + if (data != null && data is List) { + languageList.value = data.map((e) => LanguageModel.fromMap(e)).toList(); + } + + List languages = await Devicelocale.preferredLanguagesAsLocales; + if (languages.isNotEmpty) { + List list = data.map((e) => LanguageModel.fromMap(e)).toList(); + var languageEntity = list + .firstWhereOrNull((e) => e.code.contains(languages[0].languageCode)); + + if (languageEntity != null) { + fromLanguageEntity.value = languageEntity; + } + if (toLanguageEntity.value.code == fromLanguageEntity.value.code) { + int index = list.indexWhere( + (element) => element.code == toLanguageEntity.value.code); + + var num = + NumberUtils.getRandomNumberExcludingCurrent(0, list.length, index); + + toLanguageEntity.value = list[num]; + } + } + } + + void languageConvert() async { + var code = toLanguageEntity.value.code; + var name = toLanguageEntity.value.name; + + toLanguageEntity.update((fn) { + fn?.code = fromLanguageEntity.value.code; + fn?.name = fromLanguageEntity.value.name; + }); + + fromLanguageEntity.update((fn) { + fn?.code = code; + fn?.name = name; + }); + if (Get.isRegistered()) { + HomeController.to.initData(); + } + } + + void changeLanguage(LanguageModel item) { + if (isSelectFromLanguage.value) { + fromLanguageEntity.update((fn) { + fn?.code = item.code; + fn?.name = item.name; + }); + } else { + toLanguageEntity.update((fn) { + fn?.code = item.code; + fn?.name = item.name; + }); + } + if (Get.isRegistered()) { + HomeController.to.initData(); + } + } + + void languageChangeBottomSheet(bool isFrom) { + isSelectFromLanguage.value = isFrom; + Get.bottomSheet( + isScrollControlled: true, + const CommonLanguageSelector(), + ); + } + + void changeSelectLanguage(bool isFrom) { + isSelectFromLanguage.value = isFrom; + } +} diff --git a/lib/manager/tts.dart b/lib/manager/tts.dart new file mode 100644 index 0000000..226d04a --- /dev/null +++ b/lib/manager/tts.dart @@ -0,0 +1,38 @@ +import 'package:flutter_translate/common/utils/bot_toast.dart'; +import 'package:flutter_tts/flutter_tts.dart'; + +class Tts { + Tts._(); + + factory Tts() { + return _instance; + } + + static final Tts _instance = Tts._(); + + late FlutterTts ttsController = FlutterTts(); + + Future init() async { + await ttsController.setSharedInstance(true); + await ttsController.setIosAudioCategory( + IosTextToSpeechAudioCategory.ambient, + [ + IosTextToSpeechAudioCategoryOptions.allowBluetooth, + IosTextToSpeechAudioCategoryOptions.allowBluetoothA2DP, + IosTextToSpeechAudioCategoryOptions.mixWithOthers + ], + IosTextToSpeechAudioMode.voicePrompt); + await ttsController.awaitSpeakCompletion(true); + await ttsController.awaitSynthCompletion(true); + } + + Future voiceTranslator(String text, String language) async { + try { + await ttsController.stop(); + await ttsController.setLanguage(language); + await ttsController.speak(text); + } catch (e) { + toast('This language cannot be played'); + } + } +} diff --git a/lib/model/history_model.dart b/lib/model/history_model.dart new file mode 100644 index 0000000..c176f2b --- /dev/null +++ b/lib/model/history_model.dart @@ -0,0 +1,82 @@ +import 'dart:convert'; + +import 'package:hive/hive.dart'; + +part 'history_model.g.dart'; + +@HiveType(typeId: 1) +class HistoryModel extends HiveObject { + @HiveField(1) + int? translationTime; + + @HiveField(2) + String? sourceText; + + @HiveField(3) + String? targetText; + + @HiveField(4) + String? sourceLanguageName; + + @HiveField(5) + String? sourceLanguageCode; + + @HiveField(6) + String? targetLanguageName; + + @HiveField(7) + String? targetLanguageCode; + + HistoryModel({ + this.translationTime, + this.sourceText, + this.targetText, + this.sourceLanguageName, + this.sourceLanguageCode, + this.targetLanguageName, + this.targetLanguageCode, + }); + + HistoryModel fromJson(String str) => HistoryModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + HistoryModel copyWith({ + int? translationTime, + String? sourceText, + String? targetText, + String? sourceLanguageName, + String? sourceLanguageCode, + String? targetLanguageName, + String? targetLanguageCode, + }) => + HistoryModel( + translationTime: translationTime ?? this.translationTime, + sourceText: sourceText ?? this.sourceText, + targetText: targetText ?? this.targetText, + sourceLanguageName: sourceLanguageName ?? this.sourceLanguageName, + sourceLanguageCode: sourceLanguageCode ?? this.sourceLanguageCode, + targetLanguageName: targetLanguageName ?? this.targetLanguageName, + targetLanguageCode: targetLanguageCode ?? this.targetLanguageCode, + ); + + factory HistoryModel.fromMap(Map json) => HistoryModel( + translationTime: json["translationTime"], + sourceText: json["sourceText"], + targetText: json["targetText"], + sourceLanguageName: json["sourceLanguageName"], + sourceLanguageCode: json["sourceLanguageCode"], + targetLanguageName: json["targetLanguageName"], + targetLanguageCode: json["targetLanguageCode"], + ); + + Map toMap() => { + "translationTime": translationTime, + "sourceText": sourceText, + "targetText": targetText, + "sourceLanguageName": sourceLanguageName, + "sourceLanguageCode": sourceLanguageCode, + "targetLanguageName": targetLanguageName, + "targetLanguageCode": targetLanguageCode, + }; +} \ No newline at end of file diff --git a/lib/model/history_model.g.dart b/lib/model/history_model.g.dart new file mode 100644 index 0000000..332aa8b --- /dev/null +++ b/lib/model/history_model.g.dart @@ -0,0 +1,59 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'history_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class HistoryEntityAdapter extends TypeAdapter { + @override + final int typeId = 1; + + @override + HistoryModel read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return HistoryModel( + translationTime: fields[1] as int?, + sourceText: fields[2] as String?, + targetText: fields[3] as String?, + sourceLanguageName: fields[4] as String?, + sourceLanguageCode: fields[5] as String?, + targetLanguageName: fields[6] as String?, + targetLanguageCode: fields[7] as String?, + ); + } + + @override + void write(BinaryWriter writer, HistoryModel obj) { + writer + ..writeByte(7) + ..writeByte(1) + ..write(obj.translationTime) + ..writeByte(2) + ..write(obj.sourceText) + ..writeByte(3) + ..write(obj.targetText) + ..writeByte(4) + ..write(obj.sourceLanguageName) + ..writeByte(5) + ..write(obj.sourceLanguageCode) + ..writeByte(6) + ..write(obj.targetLanguageName) + ..writeByte(7) + ..write(obj.targetLanguageCode); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is HistoryEntityAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/model/language_model.dart b/lib/model/language_model.dart new file mode 100755 index 0000000..98102d2 --- /dev/null +++ b/lib/model/language_model.dart @@ -0,0 +1,23 @@ +class LanguageModel { + String code; + String name; + + LanguageModel({required this.code, required this.name}); + + LanguageModel clone() => LanguageModel( + code: code, + name: name, + ); + + factory LanguageModel.fromMap(Map json) => LanguageModel( + code: json["languageCode"], + name: json["languageName"], + ); + + Map toJson() { + final Map data = {}; + data['languageCode'] = code; + data['languageName'] = name; + return data; + } +} diff --git a/lib/model/scene_model.dart b/lib/model/scene_model.dart new file mode 100644 index 0000000..3543276 --- /dev/null +++ b/lib/model/scene_model.dart @@ -0,0 +1,101 @@ +import 'dart:convert'; + +class SceneModel { + String? sceneType; + List? sceneList; + + SceneModel({ + this.sceneType, + this.sceneList, + }); + + factory SceneModel.fromJson(String str) => SceneModel.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory SceneModel.fromMap(Map json) => SceneModel( + sceneType: json["sceneType"], + sceneList: json["sceneList"] == null ? [] : List.from(json["sceneList"]!.map((x) => SceneList.fromMap(x))), + ); + + Map toMap() => { + "sceneType": sceneType, + "sceneList": sceneList == null ? [] : List.from(sceneList!.map((x) => x.toMap())), + }; +} + +class SceneList { + String? english; + String? sceneType; + String? chineseSimplified; + String? spanish; + String? hindi; + String? arabic; + String? portuguese; + String? bengali; + String? russian; + String? punjabi; + String? javanese; + String? korean; + String? french; + String? german; + String? japanese; + + SceneList({ + this.english, + this.sceneType, + this.chineseSimplified, + this.spanish, + this.hindi, + this.arabic, + this.portuguese, + this.bengali, + this.russian, + this.punjabi, + this.javanese, + this.korean, + this.french, + this.german, + this.japanese, + }); + + factory SceneList.fromJson(String str) => SceneList.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory SceneList.fromMap(Map json) => SceneList( + english: json["English"], + sceneType: json["sceneType"], + chineseSimplified: json["Chinese (Simplified)"], + spanish: json["Spanish"], + hindi: json["Hindi"], + arabic: json["Arabic"], + portuguese: json["Portuguese"], + bengali: json["Bengali"], + russian: json["Russian"], + punjabi: json["Punjabi"], + javanese: json["Javanese"], + korean: json["Korean"], + french: json["French"], + german: json["German"], + japanese: json["Japanese"], + ); + + Map toMap() => { + "English": english, + "sceneType": sceneType, + "Chinese (Simplified)": chineseSimplified, + "Spanish": spanish, + "Hindi": hindi, + "Arabic": arabic, + "Portuguese": portuguese, + "Bengali": bengali, + "Russian": russian, + "Punjabi": punjabi, + "Javanese": javanese, + "Korean": korean, + "French": french, + "German": german, + "Japanese": japanese, + }; +} diff --git a/lib/pages/color_setting/color_setting_binding.dart b/lib/pages/color_setting/color_setting_binding.dart new file mode 100644 index 0000000..5cab232 --- /dev/null +++ b/lib/pages/color_setting/color_setting_binding.dart @@ -0,0 +1,9 @@ +import 'package:flutter_translate/pages/color_setting/color_setting_controller.dart'; +import 'package:get/get.dart'; + +class ColorSettingBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => ColorSettingController()); + } +} diff --git a/lib/pages/color_setting/color_setting_controller.dart b/lib/pages/color_setting/color_setting_controller.dart new file mode 100644 index 0000000..e501106 --- /dev/null +++ b/lib/pages/color_setting/color_setting_controller.dart @@ -0,0 +1,34 @@ +import 'package:flutter_translate/common/utils/bot_toast.dart'; +import 'package:flutter_translate/common/utils/shared_util.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:get/get.dart'; + +class ColorSettingController extends GetxController { + List colors = [ + 0xff529F2D, + 0xff4488D3, + 0xff429488, + 0xffC73B4F, + ]; + + RxInt currentColor = 0xff529F2D.obs; + + @override + void onInit() { + super.onInit(); + int homeColor = HomeController.to.appColor.value; + currentColor.value = homeColor; + } + + void changeColor(int color) { + currentColor.value = color; + } + + void submit() { + HomeController.to.appColor = currentColor; + HomeController.to.update(["home_view"]); + SharedUtil.getInstance().setData("appColor", currentColor.value); + Get.back(); + toast("Change success"); + } +} diff --git a/lib/pages/color_setting/color_setting_view.dart b/lib/pages/color_setting/color_setting_view.dart new file mode 100644 index 0000000..1ee3028 --- /dev/null +++ b/lib/pages/color_setting/color_setting_view.dart @@ -0,0 +1,160 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/common/components/base_appbar.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/pages/color_setting/color_setting_controller.dart'; +import 'package:get/get.dart'; + +class ColorSettingView extends GetView { + const ColorSettingView({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: const BaseAppbar(title: 'Color Setting'), + body: Obx( + () => SafeArea( + child: Column( + children: [ + 40.verticalSpace, + _colors(), + _translate(), + _microphone(), + Expanded(child: Container()), + _button(), + ], + ), + ), + ), + ); + } + + Widget _colors() { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 25).w, + width: double.infinity, + child: Wrap( + alignment: WrapAlignment.spaceBetween, + children: controller.colors + .map( + (color) => GestureDetector( + onTap: () => controller.changeColor(color), + child: Container( + width: 60.w, + height: 60.w, + margin: const EdgeInsets.all(5).w, + padding: const EdgeInsets.all(5).w, + decoration: BoxDecoration( + color: Color(color), + borderRadius: BorderRadius.circular(30.r), + ), + child: Image.asset( + Assets.iconSelected, + color: controller.currentColor.value == color + ? Colors.white + : Colors.transparent, + ), + ), + ), + ) + .toList(), + ), + ); + } + + Widget _translate() { + return Container( + height: 91.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(controller.currentColor.value), + borderRadius: BorderRadius.circular(22.r), + ), + padding: const EdgeInsets.symmetric(horizontal: 20).w, + margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 40).w, + child: Row( + children: [ + Expanded( + child: Text( + "Type to Translate", + style: TextStyle( + fontSize: 20.sp, + fontWeight: FontWeight.w600, + color: Colors.white, + ), + ), + ), + ], + ), + ); + } + + Widget _microphone() { + return Container( + height: 65.w, + width: 65.w, + padding: const EdgeInsets.all(15).w, + decoration: BoxDecoration( + color: Color(controller.currentColor.value).withOpacity(.7), + borderRadius: BorderRadius.circular(65.r), + ), + child: Image.asset( + Assets.iconHomeMicrophone, + color: Colors.white, + ), + ); + } + + Widget _button() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20).w, + child: Row( + children: [ + Expanded( + child: GestureDetector( + onTap: Get.back, + child: Container( + alignment: Alignment.center, + height: 45.w, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(65.r), + border: + Border.all(color: Color(controller.currentColor.value)), + ), + child: Text( + "cancel", + style: TextStyle( + color: Color(controller.currentColor.value), + fontSize: 18.sp, + ), + ), + ), + ), + ), + 10.horizontalSpace, + Expanded( + child: GestureDetector( + onTap: controller.submit, + child: Container( + alignment: Alignment.center, + height: 45.w, + decoration: BoxDecoration( + color: Color(controller.currentColor.value), + borderRadius: BorderRadius.circular(65.r), + ), + child: Text( + "submit", + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + ), + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/face_to_face/face_to_face_binding.dart b/lib/pages/face_to_face/face_to_face_binding.dart new file mode 100644 index 0000000..34deb78 --- /dev/null +++ b/lib/pages/face_to_face/face_to_face_binding.dart @@ -0,0 +1,9 @@ +import 'package:flutter_translate/pages/face_to_face/face_to_face_controller.dart'; +import 'package:get/get.dart'; + +class FaceToFaceBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => FaceToFaceController()); + } +} diff --git a/lib/pages/face_to_face/face_to_face_controller.dart b/lib/pages/face_to_face/face_to_face_controller.dart new file mode 100644 index 0000000..9b9691e --- /dev/null +++ b/lib/pages/face_to_face/face_to_face_controller.dart @@ -0,0 +1,138 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_translate/common/utils/bot_toast.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; +import 'package:flutter_translate/common/utils/object_utils.dart'; +import 'package:flutter_translate/manager/speech_convert.dart'; +import 'package:flutter_translate/manager/translate.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:get/get.dart'; +import 'package:speech_to_text/speech_recognition_result.dart'; +import 'package:translator/translator.dart'; + +class FaceToFaceController extends GetxController + with GetSingleTickerProviderStateMixin { + final aboveScrollController = ScrollController(); + final underScrollController = ScrollController(); + HomeController homeController = Get.find(); + + var angle = 0.0.obs; + + /// 显示的文本 + var aboveText = ''.obs; + var underText = ''.obs; + + /// 翻译 + final _translator = GoogleTranslator(); + + /// 是否选择的下方 + var selectedUnder = true.obs; + + @override + void onReady() async { + super.onReady(); + loading(); + speak(true); + } + + @override + void onClose() async { + await SpeechConvert().stop(showLoading: false); + aboveScrollController.dispose(); + underScrollController.dispose(); + super.onClose(); + } + + /// 旋转 180 度 + void onRotate() { + angle.value -= 0.5; + } + + Future speak(bool isUnder, {int? speakType}) async { + if (!SpeechConvert().hasSpeech) { + await SpeechConvert().init(); + } + if (SpeechConvert().hasSpeech) { + if (isUnder) { + if (!selectedUnder.value) { + await SpeechConvert().stop(); + } + selectedUnder.value = true; + _scrollToBottom(); + SpeechConvert().start( + Translate().fromLanguageEntity.value.code, + _speechResult, + ); + } else { + if (selectedUnder.value) { + await SpeechConvert().stop(); + } + selectedUnder.value = false; + _scrollToBottom(); + SpeechConvert().start( + Translate().toLanguageEntity.value.code, + _speechResult, + ); + } + } else { + toast('Speech not available'); + } + } + + Future _speechResult(SpeechRecognitionResult result) async { + Log.d('识别结果:${result.recognizedWords}'); + if (ObjectUtils.isNotEmptyStr(result.recognizedWords)) { + if (selectedUnder.value) { + underText.value += '${result.recognizedWords}\n'; + var translateText = await _translation(result.recognizedWords); + Log.d('翻译结果:${result.recognizedWords}'); + if (ObjectUtils.isNotEmptyStr(translateText)) { + aboveText.value += '$translateText\n'; + } + } else { + aboveText.value += '${result.recognizedWords}\n'; + var translateText = await _translation(result.recognizedWords); + if (ObjectUtils.isNotEmptyStr(translateText)) { + underText.value += '$translateText\n'; + } + } + _scrollToBottom(); + } + } + + Future _translation(String sourceText, {int? translationType}) async { + try { + String from = selectedUnder.value + ? Translate().fromLanguageEntity.value.code + : Translate().toLanguageEntity.value.code; + String to = selectedUnder.value + ? Translate().toLanguageEntity.value.code + : Translate().fromLanguageEntity.value.code; + Translation translate = await _translator.translate( + sourceText, + from: from, + to: to, + ); + return translate.text; + } catch (e) { + Log.d('Translation failed,${e.toString()}'); + } + return ''; + } + + void _scrollToBottom() { + if (aboveScrollController.hasClients) { + aboveScrollController.animateTo( + aboveScrollController.position.maxScrollExtent, + duration: const Duration(milliseconds: 200), + curve: Curves.easeOut, + ); + } + if (underScrollController.hasClients) { + underScrollController.animateTo( + underScrollController.position.maxScrollExtent, + duration: const Duration(milliseconds: 200), + curve: Curves.easeOut, + ); + } + } +} diff --git a/lib/pages/face_to_face/face_to_face_view.dart b/lib/pages/face_to_face/face_to_face_view.dart new file mode 100644 index 0000000..ef6436f --- /dev/null +++ b/lib/pages/face_to_face/face_to_face_view.dart @@ -0,0 +1,266 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/common/components/base_appbar.dart'; +import 'package:flutter_translate/common/utils/object_utils.dart'; +import 'package:flutter_translate/global/app_config.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/manager/speech_convert.dart'; +import 'package:flutter_translate/pages/face_to_face/face_to_face_controller.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:get/get.dart'; +import 'package:wave/config.dart'; +import 'package:wave/wave.dart'; + +class FaceToFaceView extends GetView { + const FaceToFaceView({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + extendBody: true, + extendBodyBehindAppBar: true, + appBar: _appbar(), + body: Container( + color: Colors.black, + child: Column( + children: [ + _above(context), + _under(context), + ], + ), + ), + ); + } + + BaseAppbar _appbar() { + return BaseAppbar( + backgroundColor: Colors.transparent, + backColor: Colors.white, + onBackTap: Get.back, + actionWidget: InkWell( + onTap: controller.onRotate, + child: Image.asset( + Assets.iconRotate, + width: 24.sp, + height: 24.sp, + ), + ), + ); + } + + Widget _above(BuildContext context) { + return Expanded( + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () => controller.speak(false), + child: SizedBox( + width: MediaQuery.of(context).size.width, + height: double.infinity, + child: Stack( + children: [ + Obx(() { + return Visibility( + visible: !controller.selectedUnder.value, + child: SpeechConvert().isListening.value + ? RotatedBox( + quarterTurns: 2, + child: WaveWidget( + config: CustomConfig( + colors: [ + Color(controller.homeController.appColor.value) + .withOpacity(0.2), + Color(controller.homeController.appColor.value), + ], + durations: [4000, 8000], + heightPercentages: [-0.08, -0.08], + ), + size: const Size(double.infinity, double.infinity), + backgroundColor: Colors.transparent, + waveAmplitude: 4, + // wavePhase: 0, + // waveFrequency: 0, + ), + ) + : Container( + width: double.infinity, + height: double.infinity, + color: + Color(controller.homeController.appColor.value), + ), + ); + }), + Obx(() { + return SizedBox( + width: double.infinity, + height: double.infinity, + child: Padding( + padding: EdgeInsets.fromLTRB( + 30, + SpeechConvert().isListening.value + ? MediaQuery.of(context).padding.top + kToolbarHeight + : 0, + 30, + 40, + ), + child: AnimatedRotation( + turns: controller.angle.value, + duration: const Duration(milliseconds: 500), + child: Column( + mainAxisAlignment: SpeechConvert().isListening.value + ? MainAxisAlignment.start + : MainAxisAlignment.center, + crossAxisAlignment: SpeechConvert().isListening.value + ? CrossAxisAlignment.start + : CrossAxisAlignment.center, + children: [ + if (!controller.selectedUnder.value) ...[ + Image.asset( + Assets.iconMicrophone, + width: 24.w, + height: 24.w, + ), + 20.verticalSpace, + ], + Flexible( + child: Visibility( + visible: SpeechConvert().isListening.value && + ObjectUtils.isNotEmptyStr( + controller.aboveText.value, + ), + replacement: Text( + 'Please start talking', + style: TextStyle( + color: Colors.white, + fontSize: 22.sp, + fontWeight: FontWeight.w500, + ), + ), + child: SingleChildScrollView( + controller: controller.aboveScrollController, + child: Text( + controller.aboveText.value, + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + height: 1.8, + ), + ), + ), + ), + ), + ], + ), + ), + ), + ); + }), + ], + ), + ), + ), + ); + } + + Widget _under(BuildContext context) { + return Expanded( + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () => controller.speak(true), + child: SizedBox( + width: MediaQuery.of(context).size.width, + height: double.infinity, + child: Stack( + children: [ + Obx(() => Visibility( + visible: controller.selectedUnder.value, + child: SpeechConvert().isListening.value + ? WaveWidget( + config: CustomConfig( + colors: [ + Color(controller.homeController.appColor.value) + .withOpacity(0.2), + Color(controller.homeController.appColor.value), + ], + durations: [4000, 8000], + heightPercentages: [-0.08, -0.08], + ), + size: const Size(double.infinity, double.infinity), + backgroundColor: Colors.transparent, + waveAmplitude: 4, + // wavePhase: 0, + // waveFrequency: 0, + ) + : Container( + width: double.infinity, + height: double.infinity, + color: + Color(controller.homeController.appColor.value), + ), + )), + Obx(() { + return SizedBox( + width: double.infinity, + height: double.infinity, + child: Padding( + padding: EdgeInsets.fromLTRB( + 30, + SpeechConvert().isListening.value ? 80 : 0, + 30, + MediaQuery.of(context).padding.bottom, + ), + child: Column( + mainAxisAlignment: SpeechConvert().isListening.value + ? MainAxisAlignment.start + : MainAxisAlignment.center, + crossAxisAlignment: SpeechConvert().isListening.value + ? CrossAxisAlignment.start + : CrossAxisAlignment.center, + children: [ + if (controller.selectedUnder.value) ...[ + Image.asset( + Assets.iconMicrophone, + width: 24.sp, + height: 24.sp, + ), + 20.verticalSpace, + ], + Flexible( + child: Visibility( + visible: SpeechConvert().isListening.value && + ObjectUtils.isNotEmptyStr( + controller.underText.value, + ), + replacement: Text( + 'Please start talking', + style: TextStyle( + color: Colors.white, + fontSize: 22.sp, + fontWeight: FontWeight.w500, + ), + ), + child: SingleChildScrollView( + controller: controller.underScrollController, + child: Text( + controller.underText.value, + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + height: 1.8, + ), + ), + ), + ), + ), + ], + ), + ), + ); + }), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/history/history_binding.dart b/lib/pages/history/history_binding.dart new file mode 100644 index 0000000..49b5af4 --- /dev/null +++ b/lib/pages/history/history_binding.dart @@ -0,0 +1,9 @@ +import 'package:flutter_translate/pages/history/history_controller.dart'; +import 'package:get/get.dart'; + +class HistoryBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => HistoryController()); + } +} diff --git a/lib/pages/history/history_controller.dart b/lib/pages/history/history_controller.dart new file mode 100644 index 0000000..578b12e --- /dev/null +++ b/lib/pages/history/history_controller.dart @@ -0,0 +1,64 @@ +import 'package:flutter_translate/common/hive/history_data.dart'; +import 'package:flutter_translate/common/utils/object_utils.dart'; +import 'package:flutter_translate/manager/tts.dart'; +import 'package:flutter_translate/model/history_model.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:flutter_translate/router/get_gages.dart'; +import 'package:get/get.dart'; + +class HistoryController extends GetxController { + RxMap> historyMap = + >{}.obs; + RxBool isPlaying = false.obs; + RxInt playTranslationTime = 0.obs; + HomeController homeController = Get.find(); + + @override + void onInit() { + super.onInit(); + historyMap.value = HistoryData().findGroup(); + } + + void historyTranslate(HistoryModel historyModel) { + Get.toNamed( + GetPages.translateText, + arguments: { + 'isHistory': true, + 'sourceText': historyModel.sourceText, + 'targetText': historyModel.targetText, + 'fromLanguageName': historyModel.sourceLanguageName, + 'toLanguageName': historyModel.targetLanguageName, + 'fromLanguageCode': historyModel.sourceLanguageCode, + 'toLanguageCode': historyModel.targetLanguageCode, + }, + ); + } + + void voiceTranslator(HistoryModel entity) async { + isPlaying.value = false; + playTranslationTime.value = entity.translationTime ?? 0; + if (ObjectUtils.isNotEmpty(entity.targetText)) { + isPlaying.value = true; + await Tts().voiceTranslator( + entity.targetText!, + entity.targetLanguageCode!, + ); + isPlaying.value = false; + } + } + + void remove(String key, HistoryModel entity) { + final list = HistoryData().findAll(); + historyMap.forEach((key, value) { + value.removeWhere((e) => e.translationTime == entity.translationTime); + }); + if (historyMap[key] != null && historyMap[key]!.isEmpty) { + historyMap.remove(key); + } + final deleteEntity = list.firstWhereOrNull( + (item) => item.translationTime == entity.translationTime); + if (deleteEntity != null) { + HistoryData().remove(list.indexOf(deleteEntity)); + } + } +} diff --git a/lib/pages/history/history_view.dart b/lib/pages/history/history_view.dart new file mode 100644 index 0000000..c76cb81 --- /dev/null +++ b/lib/pages/history/history_view.dart @@ -0,0 +1,203 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/common/components/base_appbar.dart'; +import 'package:flutter_translate/common/utils/object_utils.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/pages/history/history_controller.dart'; +import 'package:get/get.dart'; +import 'package:quds_ui_kit/animations/quds_animated_icon.dart'; + +class HistoryView extends GetView { + const HistoryView({super.key}); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Scaffold( + backgroundColor: Colors.white, + appBar: const BaseAppbar(title: 'History'), + body: _body(), + ), + // _subscript(), + ], + ); + } + + Widget _body() { + return Obx(() { + if (controller.historyMap.isNotEmpty) return _history(); + return Container( + alignment: Alignment.center, + width: double.infinity, + height: double.infinity, + child: const Text("Nothing"), + ); + }); + } + + Widget _history() { + return ListView.builder( + padding: const EdgeInsets.symmetric(vertical: 20).w, + itemCount: controller.historyMap.length, + itemBuilder: (context, index) { + final map = controller.historyMap.entries.elementAt(index); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 20).w, + child: Text( + map.key, + style: TextStyle( + color: const Color(0xff949494), + fontSize: 12.sp, + ), + ), + ), + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: map.value.length, + itemBuilder: (context, index) { + final item = map.value[index]; + return InkWell( + onTap: () => controller.historyTranslate(item), + child: Dismissible( + key: Key(item.translationTime.toString()), + dismissThresholds: const { + DismissDirection.startToEnd: 0.5, + DismissDirection.endToStart: 0.5, + }, + onDismissed: (_) => controller.remove(map.key, item), + background: Container( + color: const Color(0xffFC6C6B), + child: Stack( + children: [ + Positioned( + left: 16.w, + top: 0, + bottom: 0, + child: Image.asset( + width: 24, + height: 24, + Assets.iconDelete, + color: Colors.white, + ), + ), + ], + ), + ), + secondaryBackground: Container( + color: const Color(0xffFC6C6B), + child: Stack( + children: [ + Positioned( + right: 16.w, + top: 0, + bottom: 0, + child: Image.asset( + width: 24, + height: 24, + Assets.iconDelete, + color: Colors.white, + ), + ), + ], + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20, + vertical: 20, + ).w, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Obx( + () => GestureDetector( + onTap: () => controller.voiceTranslator(item), + child: ClipOval( + child: Container( + width: 32.w, + height: 32.w, + color: Color(controller.homeController.appColor.value), + child: QudsAnimatedIcon( + iconSize: 28.w, + color: Colors.white, + iconData: AnimatedIcons.pause_play, + showStartIcon: + controller.isPlaying.value && + controller.playTranslationTime + .value == + item.translationTime, + ), + ), + ), + ), + ), + 16.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + ObjectUtils.getStr(item.sourceText), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: const Color(0xff212121), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + 12.verticalSpace, + Text( + ObjectUtils.getStr(item.targetText), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: const Color(0xff979797), + fontSize: 13.sp, + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + }, + separatorBuilder: (context, index) { + return Container( + height: 0.5, + margin: const EdgeInsets.symmetric(horizontal: 20).w, + color: const Color(0xffEDEDED), + ); + }, + ), + ], + ); + }, + ); + } + + Widget _subscript() { + return Obx(() { + return Visibility( + visible: controller.historyMap.isNotEmpty, + child: Positioned( + top: 44.w, + right: 20.w, + child: SizedBox( + width: 96.w, + child: Image.asset(Assets.gifSubscript), + ), + ), + ); + }); + } +} diff --git a/lib/pages/home/components/photo_picker.dart b/lib/pages/home/components/photo_picker.dart new file mode 100644 index 0000000..39fd36d --- /dev/null +++ b/lib/pages/home/components/photo_picker.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/global/app_general.dart'; +import 'package:get/get.dart'; + +class PhotoPicker extends StatelessWidget { + const PhotoPicker({ + super.key, + required this.funCamera, + required this.funGallery, + }); + + final Function() funCamera; + final Function() funGallery; + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).padding.bottom + 100.w, + padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom).w, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10.r), + ), + child: Column( + children: [ + Expanded( + child: _buildItem('Open camera', funCamera), + ), + divider, + Expanded( + child: _buildItem('Open gallery', funGallery), + ), + ], + ), + ); + } + + Widget _buildItem(String text, Function() function) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + Get.back(); + function(); + }, + child: SizedBox( + width: double.infinity, + child: Center( + child: Text( + text, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: const Color(0xFF333333), + fontSize: 16.sp, + fontWeight: FontWeight.w600, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/home/components/setting_drawer.dart b/lib/pages/home/components/setting_drawer.dart new file mode 100644 index 0000000..367202b --- /dev/null +++ b/lib/pages/home/components/setting_drawer.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/global/app_config.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/global/app_general.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:get/get.dart'; + +class SettingDrawer extends GetView { + const SettingDrawer({super.key}); + + @override + Widget build(BuildContext context) { + return Drawer( + width: 1.sw * 0.9, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 12).w, + child: SafeArea( + child: Column( + children: [ + _settingTitle(), + 15.verticalSpace, + divider, + _settingItems(), + // Image.asset( + // Assets.gifSettingSubscript, + // width: 136.w, + // height: 136.w, + // fit: BoxFit.cover, + // ), + ], + ), + ), + ), + ); + } + + Widget _settingTitle() { + return Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(6), + child: Image.asset( + Assets.launcherIcon, + width: 48, + height: 48, + fit: BoxFit.cover, + ), + ), + 16.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + appName, + style: TextStyle( + color: Colors.black, + fontSize: 22, + fontWeight: FontWeight.w500, + overflow: TextOverflow.ellipsis, + ), + ), + Obx(() { + return Text( + controller.versionName.value, + style: const TextStyle( + color: Color(0xff979797), + fontSize: 12, + overflow: TextOverflow.ellipsis, + ), + ); + }), + ], + ), + ), + ], + ); + } + + Widget _settingItems() { + return Expanded( + child: ListView.builder( + itemCount: controller.options.length, + itemBuilder: (context, index) { + var item = controller.options[index]; + return Material( + color: Colors.transparent, + child: InkWell( + onTap: () => controller.clickItem(index), + child: Container( + padding: const EdgeInsets.symmetric( + vertical: 15, + ).w, + child: Row( + children: [ + Expanded( + child: Text( + item, + style: TextStyle( + color: const Color(0xff222F38), + fontSize: 16.sp, + overflow: TextOverflow.ellipsis, + ), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 10).w, + child: Icon( + Icons.keyboard_arrow_right_rounded, + color: const Color(0xffBCC0CE), + size: 20.sp, + ), + ), + ], + ), + ), + ), + ); + }, + ), + ); + } +} diff --git a/lib/pages/home/home_binding.dart b/lib/pages/home/home_binding.dart new file mode 100644 index 0000000..39a2925 --- /dev/null +++ b/lib/pages/home/home_binding.dart @@ -0,0 +1,9 @@ +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:get/get.dart'; + +class HomeBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => HomeController()); + } +} diff --git a/lib/pages/home/home_controller.dart b/lib/pages/home/home_controller.dart new file mode 100644 index 0000000..44b1c94 --- /dev/null +++ b/lib/pages/home/home_controller.dart @@ -0,0 +1,365 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_text_detect_area/flutter_text_detect_area.dart'; +import 'package:flutter_translate/ads/interstitial_ad_manage.dart'; +import 'package:flutter_translate/common/components/speak_alert.dart'; +import 'package:flutter_translate/common/hive/history_data.dart'; +import 'package:flutter_translate/common/utils/bot_toast.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; +import 'package:flutter_translate/common/utils/number_utils.dart'; +import 'package:flutter_translate/common/utils/object_utils.dart'; +import 'package:flutter_translate/common/utils/permission_utils.dart'; +import 'package:flutter_translate/common/utils/shared_util.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/global/app_lifecycle_reactor.dart'; +import 'package:flutter_translate/global/app_tracking_transparency_manager.dart'; +import 'package:flutter_translate/manager/speech_convert.dart'; +import 'package:flutter_translate/manager/translate.dart'; +import 'package:flutter_translate/manager/tts.dart'; +import 'package:flutter_translate/model/history_model.dart'; +import 'package:flutter_translate/model/language_model.dart'; +import 'package:flutter_translate/model/scene_model.dart'; +import 'package:flutter_translate/pages/home/components/photo_picker.dart'; +import 'package:flutter_translate/router/get_gages.dart'; +import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:speech_to_text/speech_recognition_result.dart'; + +class HomeController extends GetxController { + static HomeController get to => Get.find(); + + final GlobalKey scaffoldKey = GlobalKey(); + + var versionName = ''.obs; + + var options = ['Privacy Policy', 'User Agreement', 'Color Setting']; + + var lastWords = ''; + + var fromLanguage = Rx( + LanguageModel(code: 'en', name: 'English'), + ); + var toLanguage = Rx( + LanguageModel(code: 'zh-cn', name: 'Chinese (Simplified)'), + ); + + var fromScene = Rx("loading"); + var toScene = Rx("loading"); + + RxBool isPlayingFrom = false.obs; + RxBool isPlayingTo = false.obs; + + RxInt appColor = 0xff529F2D.obs; + + final languageModels = [ + LanguageModel(code: 'zh-cn', name: 'Chinese (Simplified)'), + LanguageModel(code: 'ar', name: 'Arabic'), + LanguageModel(code: 'bn', name: 'Bengali'), + LanguageModel(code: 'en', name: 'English'), + LanguageModel(code: 'fr', name: 'French'), + LanguageModel(code: 'de', name: 'German'), + LanguageModel(code: 'hi', name: 'Hindi'), + LanguageModel(code: 'ja', name: 'Japanese'), + LanguageModel(code: 'jv', name: 'Javanese'), + LanguageModel(code: 'ko', name: 'Korean'), + LanguageModel(code: 'pt', name: 'Portuguese'), + LanguageModel(code: 'pa', name: 'Punjabi'), + LanguageModel(code: 'ru', name: 'Russian'), + LanguageModel(code: 'es', name: 'Spanish'), + ]; + var historyList = [].obs; + + @override + void onInit() { + super.onInit(); + AppTrackingTransparencyManager().requestATT(); + AppLifecycleReactor().listenToAppStateChanges(); + + appColor.value = SharedUtil.getInstance().get("appColor") ?? 0xff554281; + _getAppVersion(); + } + + @override + void onReady() { + super.onReady(); + initData(); + initHistoryList(); + } + + @override + void onClose() { + AppLifecycleReactor().appLifecycleListener?.dispose(); + super.onClose(); + } + + void initHistoryList() { + historyList.value = HistoryData().findAll().reversed.toList(); + } + + Future initData() async { + LanguageModel fromModel = Translate().fromLanguageEntity.value; + LanguageModel toModel = Translate().toLanguageEntity.value; + + LanguageModel? f = + languageModels.firstWhereOrNull((e) => e.code == fromModel.code); + if (f != null) fromLanguage.value = f; + + LanguageModel? t = languageModels.firstWhereOrNull((e) => e.code == toModel.code); + if (t != null) toLanguage.value = t; + + var data = jsonDecode(await rootBundle.loadString(Assets.jsonScene)); + + if (data != null && data is List) { + var sceneTypeList = data.map((e) => SceneModel.fromMap(e)).toList(); + if (sceneTypeList.isNotEmpty) { + var x = NumberUtils.getRandomNumber(0, sceneTypeList.length); + SceneModel entity = sceneTypeList[x]; + if (entity.sceneList != null && entity.sceneList!.isNotEmpty) { + var y = NumberUtils.getRandomNumber(0, entity.sceneList!.length); + fromScene.value = _getSentence(true, entity.sceneList![y]); + toScene.value = _getSentence(false, entity.sceneList![y]); + } + } + } + } + + /// 获取版本号 + void _getAppVersion() async { + final packageInfo = await PackageInfo.fromPlatform(); + versionName.value = 'version number ${packageInfo.version}'; + } + + void openHomeDrawer() { + scaffoldKey.currentState?.openDrawer(); + } + + void clickItem(int index) { + Log.d(index); + if (index == 2) { + Get.toNamed(GetPages.colorSetting); + } else { + Get.toNamed(GetPages.webView, arguments: { + 'title': options[index], + 'url': index == 0 + ? 'https://trans-globe.mystrikingly.com/privacy' + : 'https://trans-globe.mystrikingly.com/terms', + }); + } + scaffoldKey.currentState?.closeDrawer(); + } + + String _getSentence(bool isFrom, SceneList sceneList) { + List keys = sceneList.toMap().keys.toList(); + List values = sceneList.toMap().values.toList(); + int index = keys.indexWhere( + (e) => e == (isFrom ? fromLanguage.value.name : toLanguage.value.name)); + if (index != -1) { + return values[index]; + } + return 'loading'; + } + + void textConvertVoice(bool isFrom) async { + isPlayingTo.value = false; + isPlayingFrom.value = false; + if (isFrom) { + isPlayingFrom.value = true; + await Tts().voiceTranslator(fromScene.value, fromLanguage.value.code); + isPlayingFrom.value = false; + } else { + isPlayingTo.value = true; + await Tts().voiceTranslator(toScene.value, toLanguage.value.code); + isPlayingTo.value = false; + } + } + + void sceneCategory() { + Get.toNamed(GetPages.sceneCategory); + } + + Future photos() async { + Get.bottomSheet( + isScrollControlled: true, + PhotoPicker( + funCamera: () async { + await PermissionUtils.checkPermission( + [Permission.camera], + ).then((res) { + if (!res) return; + _openCameraGallery(ImageSource.camera); + }); + }, + funGallery: () async { + Permission permission = Permission.photos; + await PermissionUtils.checkPermission( + [permission], + ).then((res) { + if (!res) return; + _openCameraGallery(ImageSource.gallery); + }); + }, + ), + ); + } + + void face2face() { + InterstitialAdManager().showAdIfReady( + InterstitialAdManager().adIds[2], + onTap: () async { + bool micResult = await PermissionUtils.checkPermission( + [Permission.microphone], + ); + if (!micResult) return; + if (Platform.isIOS) { + bool speechResult = await PermissionUtils.checkPermission( + [Permission.speech], + ); + if (!speechResult) return; + } + Get.toNamed(GetPages.faceToFace); + }, + ); + } + + void history() { + Get.toNamed(GetPages.history); + } + + void translator() { + Get.toNamed(GetPages.translator); + } + + Future speak() async { + bool micResult = + await PermissionUtils.checkPermission([Permission.microphone]); + if (!micResult) return; + if (Platform.isIOS) { + bool speechResult = + await PermissionUtils.checkPermission([Permission.speech]); + if (!speechResult) return; + } + await Get.dialog( + barrierDismissible: true, + useSafeArea: false, + SpeakAlert( + isListening: SpeechConvert().isListening, + onTap: () async { + if (!SpeechConvert().hasSpeech) { + await SpeechConvert().init(); + } + if (SpeechConvert().hasSpeech) { + if (SpeechConvert().isListening.value) { + _translatedText(); + } else { + SpeechConvert().start( + Translate().fromLanguageEntity.value.code, + (SpeechRecognitionResult result) { + Log.d('识别结果:${result.recognizedWords}'); + lastWords = result.recognizedWords; + }, + ); + } + } else { + Get.back(); + toast('Speech not available'); + } + }, + ), + ); + if (Get.isDialogOpen != null && !Get.isDialogOpen!) { + SpeechConvert().stop(showLoading: false); + } + } + + void _translatedText() { + if (ObjectUtils.isEmpty(lastWords)) { + toast('No text recognized'); + return; + } + Get.back(); + Get.toNamed( + GetPages.translateText, + arguments: {"sourceText": lastWords}, + ); + } + + Future _openCameraGallery(ImageSource source) async { + String detectedValue = ""; + final ImagePicker picker = ImagePicker(); + final XFile? photo = await picker.pickImage(source: source); + if (photo != null) { + Get.to(() => SelectImageAreaTextDetect( + detectOnce: true, + enableImageInteractions: true, + imagePath: photo.path, + onDetectText: (v) { + if (v is String) { + detectedValue = v; + } + if (v is List) { + int counter = 0; + for (var element in v) { + detectedValue += "$counter. \t\t $element \n\n"; + counter++; + } + } + }, + onDetectError: (error) { + ///This error will occurred in Android only while user will try to crop image at max zoom level then ml kit will throw max 32 height/width exception + if (error is PlatformException && + (error.message?.contains( + "InputImage width and height should be at least 32!", + ) ?? + false)) { + toast( + 'Selected area should be able to crop image with at least 32 width and height.', + ); + } + }, + ))?.then( + (onValue) { + InterstitialAdManager().showAdIfReady( + InterstitialAdManager().adIds[3], + onTap: () { + if (ObjectUtils.isEmpty(detectedValue)) { + toast('No text recognized'); + return; + } + Get.toNamed( + GetPages.translateText, + arguments: {"sourceText": detectedValue}, + ); + }, + ); + }, + ); + } + } + + void removeHistoryByIndex(int index) { + // 计算原始列表中的对应索引 + int indexToRemoveFromDb = HistoryData().findAll().length - 1 - index; + historyList.removeAt(indexToRemoveFromDb); + HistoryData().remove(indexToRemoveFromDb); + } + + void historyTranslate(HistoryModel historyModel) { + Get.toNamed( + GetPages.translateText, + arguments: { + 'isHistory': true, + 'sourceText': historyModel.sourceText, + 'targetText': historyModel.targetText, + 'fromLanguageName': historyModel.sourceLanguageName, + 'toLanguageName': historyModel.targetLanguageName, + 'fromLanguageCode': historyModel.sourceLanguageCode, + 'toLanguageCode': historyModel.targetLanguageCode, + }, + ); + } +} diff --git a/lib/pages/home/home_view.dart b/lib/pages/home/home_view.dart new file mode 100644 index 0000000..39955cc --- /dev/null +++ b/lib/pages/home/home_view.dart @@ -0,0 +1,523 @@ +import 'package:custom_pop_up_menu/custom_pop_up_menu.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/common/components/common_language_selector_bar.dart'; +import 'package:flutter_translate/common/utils/object_utils.dart'; +import 'package:flutter_translate/global/app_config.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/model/history_model.dart'; +import 'package:flutter_translate/pages/home/components/setting_drawer.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:get/get.dart'; +import 'package:pie_menu/pie_menu.dart'; +import 'package:quds_ui_kit/animations/quds_animated_icon.dart'; + +class HomeView extends GetView { + const HomeView({super.key}); + + @override + Widget build(BuildContext context) { + return PieCanvas( + theme: PieTheme( + delayDuration: Duration.zero, + tooltipTextStyle: TextStyle( + fontSize: 44.sp, + fontWeight: FontWeight.w600, + ), + ), + child: Builder( + builder: (context) => Scaffold( + resizeToAvoidBottomInset: false, + key: controller.scaffoldKey, + drawer: const SettingDrawer(), + body: GetBuilder( + id: "home_view", + builder: (_) => Container( + padding: const EdgeInsets.symmetric(horizontal: 12).w, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Color(controller.appColor.value).withOpacity(0.2), + Colors.white, + ], + begin: const FractionalOffset(0, -2), + end: const FractionalOffset(0, 1), + ), + ), + child: SafeArea( + child: Column( + children: [ + 15.verticalSpace, + const CommonLanguageSelectorBar(), + 30.verticalSpace, + _dailyQuote(), + 20.verticalSpace, + _buildTranslate(), + 20.verticalSpace, + _historyList(), + _bottomBar(context), + ], + ), + ), + ), + ), + ), + ), + ); + } + + Widget _title() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: controller.openHomeDrawer, + child: Container( + width: 32.w, + height: 32.w, + padding: const EdgeInsets.all(3).w, + decoration: BoxDecoration( + color: Color(controller.appColor.value), + borderRadius: BorderRadius.circular(8.r), + ), + child: Image.asset(Assets.iconHomeTitleMore), + ), + ), + Text( + appName, + style: TextStyle( + color: const Color(0xff1E1E1E), + fontSize: 24.sp, + fontWeight: FontWeight.w600, + ), + ), + 32.horizontalSpace, + ], + ); + } + + Widget _dailyQuote() { + return GestureDetector( + onTap: controller.sceneCategory, + child: Column( + children: [ + Container( + padding: const EdgeInsets.only(top: 28, left: 22, bottom: 31).w, + decoration: BoxDecoration( + color: const Color(0xffBFE9D4), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(16.r), + topRight: Radius.circular(16.r), + ), + ), + child: Stack( + clipBehavior: Clip.none, + alignment: AlignmentDirectional.bottomStart, + children: [ + Positioned( + bottom: 2.8.w, + child: Container( + width: 73.w, + height: 7.w, + decoration: BoxDecoration( + color: const Color(0xff5CC2AD), + borderRadius: BorderRadius.circular(16), + ), + ), + ), + Row( + children: [ + Text( + "Daily Quote", + style: TextStyle( + fontSize: 20.sp, + fontWeight: FontWeight.w800, + fontStyle: FontStyle.italic, + color: const Color(0xff240F69), + ), + ), + Container( + margin: const EdgeInsets.only(left: 5).w, + child: Image.asset( + Assets.iconArrowRight, + color: const Color(0xff240F69), + width: 14.w, + height: 14.w, + ), + ), + ], + ), + Positioned( + right: -20.w, + bottom: -31.w, + child: Image.asset( + Assets.imagesSuspendedDecoration, + width: 211.41.w, + height: 99.14.w, + ), + ), + ], + ), + ), + Container( + width: double.infinity, + height: 168.w, + padding: const EdgeInsets.symmetric(horizontal: 20).w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(16.r), + bottomRight: Radius.circular(16.r), + ), + ), + child: Column( + children: [ + _sceneWidget(true), + const Divider(height: 1, thickness: 1), + _sceneWidget(false), + ], + ), + ), + ], + ), + ); + } + + Widget _sceneWidget(bool isFrom) { + return SizedBox( + height: 83.5.w, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Obx(() { + return Text( + isFrom + ? controller.fromLanguage.value.name + : controller.toLanguage.value.name, + style: TextStyle( + fontSize: 12.sp, + color: const Color(0xffC2C3C5), + ), + ); + }), + 9.verticalSpace, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Obx( + () => Text( + isFrom + ? controller.fromScene.value + : controller.toScene.value, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 14.sp, + color: const Color(0xff152A3D), + fontWeight: FontWeight.w500, + ), + ), + ), + Obx( + () => GestureDetector( + onTap: () => controller.textConvertVoice(isFrom), + child: ClipOval( + child: Container( + width: 24.w, + height: 24.w, + color: Color(controller.appColor.value), + child: QudsAnimatedIcon( + color: Colors.white, + iconData: AnimatedIcons.pause_play, + showStartIcon: isFrom + ? controller.isPlayingFrom.value + : controller.isPlayingTo.value, + ), + ), + ), + ), + ), + ], + ), + ], + ), + ); + } + + Widget _buildTranslate() { + return Column( + children: [ + GestureDetector( + onTap: controller.translator, + child: Container( + height: 91.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(controller.appColor.value), + borderRadius: BorderRadius.circular(22.r), + ), + padding: const EdgeInsets.symmetric(horizontal: 20).w, + child: Row( + children: [ + Expanded( + child: Text( + "Type to Translate", + style: TextStyle( + fontSize: 20.sp, + fontWeight: FontWeight.w600, + color: Colors.white, + ), + ), + ), + ], + ), + ), + ), + ], + ); + } + + Widget _historyList() { + return Obx( + () => controller.historyList.isNotEmpty + ? Expanded( + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 15).w, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "History", + style: TextStyle( + fontSize: 16.sp, + color: const Color(0xff979797), + fontWeight: FontWeight.w500, + ), + ), + ], + ), + Expanded( + child: ListView.builder( + itemCount: controller.historyList.length, + itemBuilder: (context, index) { + HistoryModel historyModel = + controller.historyList[index]; + return _historyItem(historyModel, index); + }, + ), + ), + ], + ), + ), + ) + : Expanded(child: Container()), + ); + } + + Widget _historyItem(HistoryModel historyModel, int index) { + return CustomPopupMenu( + arrowColor: Colors.black, + barrierColor: Colors.transparent, + position: PreferredPosition.top, + verticalMargin: 0, + pressType: PressType.longPress, + menuBuilder: () { + return GestureDetector( + onTap: () => controller.removeHistoryByIndex(index), + child: Container( + padding: const EdgeInsets.all(10).w, + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(8.r), + ), + child: Image.asset(Assets.iconDelete, width: 24.w), + ), + ); + }, + child: InkWell( + onTap: () => controller.historyTranslate(historyModel), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 10).w, + child: RichText( + maxLines: 1, + overflow: TextOverflow.ellipsis, + text: TextSpan( + children: [ + TextSpan( + text: ObjectUtils.getStr(historyModel.sourceText), + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 16.sp, + color: const Color(0xff212121), + ), + ), + WidgetSpan(child: 6.horizontalSpace), + TextSpan( + text: ObjectUtils.getStr(historyModel.targetText), + style: TextStyle( + color: const Color(0xff979797), + fontSize: 13.sp, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ), + ], + ), + ), + ); + } + + // Widget _tools() { + // return Padding( + // padding: const EdgeInsets.symmetric(horizontal: 12).w, + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // _toolItemWidget( + // controller.photos, + // Assets.iconToolsPhoto, + // "Photo", + // ), + // _toolItemWidget( + // controller.face2face, + // Assets.iconToolsDialog, + // "Face2face", + // ), + // _toolItemWidget( + // controller.history, + // Assets.iconToolsHistory, + // "History", + // ), + // ], + // ), + // ); + // } + + // Widget _toolItemWidget( + // GestureTapCallback? onTap, + // String icon, + // String title, + // ) { + // return Column( + // children: [ + // GestureDetector( + // onTap: onTap, + // child: Container( + // width: 32.w, + // height: 32.w, + // padding: const EdgeInsets.all(8).w, + // decoration: BoxDecoration( + // color: Colors.white, + // borderRadius: BorderRadius.circular(24.r), + // ), + // child: Image.asset(icon), + // ), + // ), + // 10.verticalSpace, + // Text( + // title, + // style: TextStyle( + // fontSize: 14.sp, + // color: Colors.black, + // fontWeight: FontWeight.w500, + // ), + // ), + // ], + // ); + // } + + Widget _bottomBar(context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 40).w, + child: Row( + children: [ + GestureDetector( + onTap: controller.openHomeDrawer, + child: Icon( + Icons.menu, + size: 30.w, + color: Colors.grey, + ), + ), + const Spacer(), + Flexible( + child: GestureDetector( + onTap: controller.speak, + child: Container( + height: 65.w, + width: 65.w, + padding: const EdgeInsets.all(15).w, + decoration: BoxDecoration( + color: Color(controller.appColor.value).withOpacity(.7), + borderRadius: BorderRadius.circular(65.r), + ), + child: Image.asset( + Assets.iconHomeMicrophone, + color: Colors.white, + ), + ), + ), + ), + const Spacer(), + SizedBox( + width: 30.w, + height: 30.w, + child: PieMenu( + theme: PieTheme.of(context).copyWith( + buttonTheme: const PieButtonTheme( + backgroundColor: Colors.white, + iconColor: Colors.white, + ), + buttonThemeHovered: const PieButtonTheme( + backgroundColor: Colors.white, + iconColor: Colors.black, + ), + brightness: Brightness.dark, + ), + actions: [ + PieAction( + tooltip: const Text(''), + onSelect: controller.photos, + child: Container( + padding: const EdgeInsets.all(5).w, + child: Image.asset(Assets.iconToolsPhoto), + ), + ), + PieAction( + tooltip: const Text(''), + onSelect: controller.face2face, + child: Container( + padding: const EdgeInsets.all(5).w, + child: Image.asset(Assets.iconToolsDialog), + ), + ), + PieAction( + tooltip: const Text(''), + onSelect: controller.history, + child: Container( + padding: const EdgeInsets.all(5).w, + child: Image.asset(Assets.iconToolsHistory), + ), + ), + ], + child: Icon( + Icons.more_outlined, + size: 30.w, + color: Colors.grey, + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/launch/launch_binding.dart b/lib/pages/launch/launch_binding.dart new file mode 100644 index 0000000..ff97768 --- /dev/null +++ b/lib/pages/launch/launch_binding.dart @@ -0,0 +1,9 @@ +import 'package:flutter_translate/pages/launch/launch_controller.dart'; +import 'package:get/get.dart'; + +class LaunchBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => LaunchController()); + } +} diff --git a/lib/pages/launch/launch_controller.dart b/lib/pages/launch/launch_controller.dart new file mode 100644 index 0000000..330b08a --- /dev/null +++ b/lib/pages/launch/launch_controller.dart @@ -0,0 +1,74 @@ +import 'dart:async'; + +import 'package:flutter_translate/ads/interstitial_ad_manage.dart'; +import 'package:flutter_translate/common/hive/remote_config_box.dart'; +import 'package:flutter_translate/global/app_config.dart'; +import 'package:flutter_translate/global/network_connectivity_service.dart'; +import 'package:flutter_translate/router/get_gages.dart'; +import 'package:get/get.dart'; + +class LaunchController extends GetxController with GetSingleTickerProviderStateMixin { + static LaunchController get to => Get.find(); + Timer? timer; + /// 进度总时长 + var timeTotal = 15.0 * 1000; + /// 当前进度 + var currentProcess = 0.0.obs; + /// 进度每次变化值 + var changeValue = 10; + + @override + void onReady() async { + super.onReady(); + await _checkGuaranteedDate(); + Get.put(NetworkConnectivityService()); + } + + @override + void onClose() { + _stopTimer(); + super.onClose(); + } + + /// 检查是否到保底日期 + Future _checkGuaranteedDate() async { + if (!RemoteConfigBox().getAdSwitch()) { + if (getGuaranteedDate().isBefore(DateTime.now())) { + await RemoteConfigBox().putAdSwitch(true); + } + } + } + + /// 开始定时器 + void startTimer() { + timer = Timer.periodic(const Duration(milliseconds: 10), (Timer t) async { + if (currentProcess.value + changeValue >= timeTotal) { + currentProcess.value = timeTotal; + _stopTimer(); + _openHome(); + return; + } + currentProcess.value += changeValue; + }); + } + + /// 停止定时器 + void _stopTimer() { + timer?.cancel(); + timer = null; + } + + /// 修改进度变化值 + void editChangeValue() { + changeValue = 300; + } + + void _openHome() { + InterstitialAdManager().showAdIfReady( + InterstitialAdManager().adIds[0], + onTap: () { + Get.offNamed(GetPages.home); + }, + ); + } +} diff --git a/lib/pages/launch/launch_view.dart b/lib/pages/launch/launch_view.dart new file mode 100644 index 0000000..95dad04 --- /dev/null +++ b/lib/pages/launch/launch_view.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/pages/launch/launch_controller.dart'; +import 'package:get/get.dart'; + +class LaunchView extends StatelessWidget { + LaunchView({super.key}); + + final controller = Get.find(); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + _buildImageBg(), + _buildProgress(), + ], + ), + ); + } + + Widget _buildImageBg() { + return Image.asset( + Assets.imagesLaunchImage, + width: 1.sw, + height: 1.sh, + fit: BoxFit.cover, + ); + } + + Widget _buildProgress() { + return Container( + alignment: Alignment.center, + margin: const EdgeInsets.only(bottom: 60).h, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + SizedBox( + width: 0.6.sw, + child: Obx(() { + return LinearProgressIndicator( + value: controller.currentProcess.value / controller.timeTotal, + valueColor: const AlwaysStoppedAnimation(Color(0xffA2EDEE)), + backgroundColor: const Color(0xffA2EDEE).withOpacity(0.2), + borderRadius: BorderRadius.circular(8).r, + minHeight: 6.h, + ); + }), + ), + SizedBox(height: 10.h), + Text( + 'Resource Loading...', + style: TextStyle( + color: Colors.black, + fontSize: 12.sp, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/scene_category/scene_category_binding.dart b/lib/pages/scene_category/scene_category_binding.dart new file mode 100644 index 0000000..1c8ba7a --- /dev/null +++ b/lib/pages/scene_category/scene_category_binding.dart @@ -0,0 +1,9 @@ +import 'package:flutter_translate/pages/scene_category/scene_category_controller.dart'; +import 'package:get/get.dart'; + +class SceneCategoryBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => SceneCategoryController()); + } +} diff --git a/lib/pages/scene_category/scene_category_controller.dart b/lib/pages/scene_category/scene_category_controller.dart new file mode 100644 index 0000000..a163df2 --- /dev/null +++ b/lib/pages/scene_category/scene_category_controller.dart @@ -0,0 +1,27 @@ +import 'dart:convert'; + +import 'package:flutter/services.dart'; +import 'package:flutter_translate/common/components/view_state.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/model/scene_model.dart'; +import 'package:flutter_translate/router/get_gages.dart'; +import 'package:get/get.dart'; + +class SceneCategoryController extends GetxController { + var sceneTypeList = [].obs; + var viewState = ViewStateEnum.loading.obs; + + @override + void onReady() async { + super.onReady(); + var data = jsonDecode(await rootBundle.loadString(Assets.jsonScene)); + if (data != null && data is List) { + sceneTypeList.value = data.map((e) => SceneModel.fromMap(e)).toList(); + } + viewState.value = sceneTypeList.isNotEmpty ? ViewStateEnum.normal : ViewStateEnum.empty; + } + + void sceneList(List sceneList) { + Get.toNamed(GetPages.sceneList, arguments: sceneList); + } +} diff --git a/lib/pages/scene_category/scene_category_view.dart b/lib/pages/scene_category/scene_category_view.dart new file mode 100644 index 0000000..5e7ac12 --- /dev/null +++ b/lib/pages/scene_category/scene_category_view.dart @@ -0,0 +1,150 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/common/components/base_appbar.dart'; +import 'package:flutter_translate/common/components/view_state.dart'; +import 'package:flutter_translate/common/utils/object_utils.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/model/scene_model.dart'; +import 'package:flutter_translate/pages/scene_category/scene_category_controller.dart'; +import 'package:get/get.dart'; + +class SceneCategoryView extends GetView { + const SceneCategoryView({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: const BaseAppbar(title: 'Selected Oral Expressions'), + body: _body(), + ); + } + + Widget _body() { + return Obx(() { + return ViewState( + viewStateEnum: controller.viewState.value, + child: ListView.builder( + itemCount: controller.sceneTypeList.length, + itemBuilder: (context, index) { + var item = controller.sceneTypeList[index]; + return _sceneItem(item); + }, + ), + ); + }); + } + + Widget _sceneItem(SceneModel item) { + String image = Assets.imagesDailyQuoteShopping; + Color bgColor = const Color(0xff4E5AEC); + if (item.sceneType == 'Shopping') { + image = Assets.imagesDailyQuoteShopping; + bgColor = const Color(0xff4E5AEC); + } else if (item.sceneType == 'Study') { + image = Assets.imagesDailyQuoteStudy; + bgColor = const Color(0xff79CB9A); + } else if (item.sceneType == 'Work') { + image = Assets.imagesDailyQuoteWork; + bgColor = const Color(0xffFC6C6B); + } else if (item.sceneType == 'Healthy') { + image = Assets.imagesDailyQuoteHealthy; + bgColor = const Color(0xff53DED1); + } else if (item.sceneType == 'Daily greetings') { + image = Assets.imagesDailyQuoteGreetings; + bgColor = const Color(0xffADAEFF); + } else if (item.sceneType == 'Family') { + image = Assets.imagesDailyQuoteFamily; + bgColor = const Color(0xffFFEE8B); + } else if (item.sceneType == 'Making friends') { + image = Assets.imagesDailyQuoteMakeFriends; + bgColor = const Color(0xffFFE7EF); + } else if (item.sceneType == 'Transportation') { + image = Assets.imagesDailyQuoteTransportation; + bgColor = const Color(0xff45A7FE); + } else if (item.sceneType == 'Travel') { + image = Assets.imagesDailyQuoteTravel; + bgColor = const Color(0xffFEE5C5); + } else if (item.sceneType == 'Dining') { + image = Assets.imagesDailyQuoteDinning; + bgColor = const Color(0xffFD9D65); + } + return InkWell( + onTap: () => controller.sceneList(item.sceneList ?? []), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 20).w, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 66.w, + height: 82.w, + clipBehavior: Clip.hardEdge, + decoration: BoxDecoration( + color: bgColor, + borderRadius: BorderRadius.circular(7), + ), + child: Stack( + children: [ + Positioned( + bottom: 0, + right: 0, + child: FittedBox( + fit: BoxFit.none, + child: Image.asset( + image, + width: 38.w, + height: 38.w, + ), + ), + ), + Positioned( + top: 4.w, + left: 7.w, + right: 7.w, + child: Text( + ObjectUtils.getStr(item.sceneType).toUpperCase(), + maxLines: 3, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: FontWeight.w700, + ), + ), + ), + ], + ), + ), + 15.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + ObjectUtils.getStr(item.sceneType), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: const Color(0xff152A3D), + fontSize: 16.sp, + fontWeight: FontWeight.w600, + ), + ), + Text( + '${item.sceneList != null ? item.sceneList!.length : 0} selected authentic spoken sentences', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: const Color(0xff696969), + fontSize: 11.sp, + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/scene_list/components/language_selector.dart b/lib/pages/scene_list/components/language_selector.dart new file mode 100644 index 0000000..c2c1088 --- /dev/null +++ b/lib/pages/scene_list/components/language_selector.dart @@ -0,0 +1,121 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/model/language_model.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:flutter_translate/pages/scene_list/scene_list_controller.dart'; +import 'package:get/get.dart'; + +class LanguageSelector extends GetView { + const LanguageSelector({ + super.key, + required this.isFrom, + }); + + final bool isFrom; + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height * 0.6, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(26.r), + topRight: Radius.circular(26.r), + ), + ), + child: Column( + children: [ + 12.verticalSpace, + Container( + width: 28.w, + height: 4.w, + decoration: BoxDecoration( + color: const Color(0xffD9D9D9), + borderRadius: BorderRadius.circular(2.r), + ), + ), + 10.verticalSpace, + _buildListView(), + ], + ), + ); + } + + Widget _buildListView() { + final languageModels = [ + LanguageModel(code: 'zh-cn', name: 'Chinese (Simplified)'), + LanguageModel(code: 'ar', name: 'Arabic'), + LanguageModel(code: 'bn', name: 'Bengali'), + LanguageModel(code: 'en', name: 'English'), + LanguageModel(code: 'fr', name: 'French'), + LanguageModel(code: 'de', name: 'German'), + LanguageModel(code: 'hi', name: 'Hindi'), + LanguageModel(code: 'ja', name: 'Japanese'), + LanguageModel(code: 'jv', name: 'Javanese'), + LanguageModel(code: 'ko', name: 'Korean'), + LanguageModel(code: 'pt', name: 'Portuguese'), + LanguageModel(code: 'pa', name: 'Punjabi'), + LanguageModel(code: 'ru', name: 'Russian'), + LanguageModel(code: 'es', name: 'Spanish'), + ]; + return Expanded( + child: ListView.builder( + itemCount: languageModels.length, + itemBuilder: (context, index) { + var item = languageModels[index]; + return Material( + color: Colors.transparent, + child: InkWell( + onTap: () => controller.changeLanguage(item, isFrom), + child: Container( + padding: const EdgeInsets.symmetric( + vertical: 13, + horizontal: 33, + ).w, + child: GetBuilder( + builder: (c) => Row( + children: [ + Expanded( + child: Text( + item.name, + style: TextStyle( + color: item.name == + (isFrom + ? controller.fromLanguage.value.name + : controller.toLanguage.value.name) + ? Color(c.appColor.value) + : const Color(0xff152A3D), + fontSize: 16.sp, + overflow: TextOverflow.ellipsis, + ), + ), + ), + Visibility( + visible: item.name == + (isFrom + ? controller.fromLanguage.value.name + : controller.toLanguage.value.name), + child: Padding( + padding: const EdgeInsets.only(left: 10).w, + child: Image.asset( + Assets.iconStarGreen, + color: Color(c.appColor.value), + width: 16.w, + height: 16.w, + ), + ), + ), + ], + ), + ), + ), + ), + ); + }, + ), + ); + } +} diff --git a/lib/pages/scene_list/components/language_selector_bar.dart b/lib/pages/scene_list/components/language_selector_bar.dart new file mode 100644 index 0000000..9f52ae4 --- /dev/null +++ b/lib/pages/scene_list/components/language_selector_bar.dart @@ -0,0 +1,74 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/pages/scene_list/scene_list_controller.dart'; +import 'package:get/get.dart'; + +class LanguageSelectorBar extends GetView { + const LanguageSelectorBar({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + _language(true), + _convertIcon(), + _language(false), + ], + ); + } + + Widget _convertIcon() { + return GestureDetector( + onTap: controller.languageConvert, + child: Container( + width: 26.w, + height: 18.w, + margin: const EdgeInsets.symmetric(horizontal: 15).w, + padding: const EdgeInsets.symmetric( + horizontal: 7, + vertical: 3, + ).w, + decoration: BoxDecoration( + color: const Color(0xfff1f1f1), + borderRadius: BorderRadius.circular(9.r), + ), + child: Image.asset(Assets.iconConvert), + ), + ); + } + + Widget _language(isFrom) { + return Expanded( + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: () => controller.showChangeLanguageBottomSheet(isFrom), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Flexible( + child: Obx(() { + return Text( + isFrom + ? controller.fromLanguage.value.name + : controller.toLanguage.value.name, + style: const TextStyle( + color: Color(0xff435561), + fontSize: 14, + fontWeight: FontWeight.w500, + overflow: TextOverflow.ellipsis, + ), + ); + }), + ), + 4.horizontalSpace, + Image.asset(Assets.iconArrowBottom, width: 8.w), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/scene_list/scene_list_binding.dart b/lib/pages/scene_list/scene_list_binding.dart new file mode 100644 index 0000000..61f1082 --- /dev/null +++ b/lib/pages/scene_list/scene_list_binding.dart @@ -0,0 +1,9 @@ +import 'package:flutter_translate/pages/scene_list/scene_list_controller.dart'; +import 'package:get/get.dart'; + +class SceneListBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => SceneListController()); + } +} diff --git a/lib/pages/scene_list/scene_list_controller.dart b/lib/pages/scene_list/scene_list_controller.dart new file mode 100644 index 0000000..66395c4 --- /dev/null +++ b/lib/pages/scene_list/scene_list_controller.dart @@ -0,0 +1,104 @@ +import 'package:flutter_translate/manager/tts.dart'; +import 'package:flutter_translate/model/language_model.dart'; +import 'package:flutter_translate/model/scene_model.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:flutter_translate/pages/scene_list/components/language_selector.dart'; +import 'package:get/get.dart'; +import 'package:get/get_rx/get_rx.dart'; + +class SceneListController extends GetxController { + final HomeController homeController = Get.put(HomeController()); + + late Rx fromLanguage = Rx( + homeController.fromLanguage.value.clone(), + ); + late Rx toLanguage = Rx( + homeController.toLanguage.value.clone(), + ); + + var sceneList = []; + RxBool isPlayingFrom = false.obs; + RxBool isPlayingTo = false.obs; + RxInt playIndex = 0.obs; + + @override + void onInit() { + super.onInit(); + sceneList = Get.arguments; + } + + void showChangeLanguageBottomSheet(bool isFrom) { + if (isFrom) { + Get.bottomSheet( + LanguageSelector(isFrom: isFrom), + ); + } else { + Get.bottomSheet( + LanguageSelector(isFrom: isFrom), + ); + } + } + + void playTranslationResults( + bool isFrom, + SceneList item, + int playIndex, + ) async { + this.playIndex.value = playIndex; + isPlayingTo.value = false; + isPlayingFrom.value = false; + if (isFrom) { + isPlayingFrom.value = true; + await Tts().voiceTranslator( + getSentence(isFrom, item), + fromLanguage.value.code, + ); + isPlayingFrom.value = false; + } else { + isPlayingTo.value = true; + await Tts().voiceTranslator( + getSentence(isFrom, item), + toLanguage.value.code, + ); + isPlayingTo.value = false; + } + } + + String getSentence(bool isFrom, SceneList sceneList) { + List keys = sceneList.toMap().keys.toList(); + List values = sceneList.toMap().values.toList(); + int index = keys.indexWhere( + (e) => e == (isFrom ? fromLanguage.value.name : toLanguage.value.name)); + if (index != -1) return values[index]; + return 'loading'; + } + + void changeLanguage(LanguageModel item, bool isFrom) { + if (isFrom) { + fromLanguage.update((fn) { + fn?.code = item.code; + fn?.name = item.name; + }); + } else { + toLanguage.update((fn) { + fn?.code = item.code; + fn?.name = item.name; + }); + } + Get.back(); + } + + void languageConvert() { + var code = toLanguage.value.code; + var name = toLanguage.value.name; + + toLanguage.update((fn) { + fn?.code = fromLanguage.value.code; + fn?.name = fromLanguage.value.name; + }); + fromLanguage.update((fn) { + fn?.code = code; + fn?.name = name; + }); + } +} diff --git a/lib/pages/scene_list/scene_list_view.dart b/lib/pages/scene_list/scene_list_view.dart new file mode 100644 index 0000000..38755d8 --- /dev/null +++ b/lib/pages/scene_list/scene_list_view.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/common/components/base_appbar.dart'; +import 'package:flutter_translate/global/app_general.dart'; +import 'package:flutter_translate/model/scene_model.dart'; +import 'package:flutter_translate/pages/scene_list/components/language_selector_bar.dart'; +import 'package:flutter_translate/pages/scene_list/scene_list_controller.dart'; +import 'package:get/get.dart'; +import 'package:quds_ui_kit/animations/quds_animated_icon.dart'; + +class SceneListView extends GetView { + const SceneListView({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xffF5F6F8), + appBar: const BaseAppbar( + titleWidget: Expanded(child: LanguageSelectorBar()), + ), + body: _sceneList(), + ); + } + + Widget _sceneList() { + return ListView.separated( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12).w, + itemCount: controller.sceneList.length, + itemBuilder: (context, index) { + var item = controller.sceneList[index]; + return Container( + padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 20).w, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.r), + ), + child: Obx( + () => Column( + children: [ + _scene( + item, + isFrom: true, + languageName: controller.fromLanguage.value.name, + index: index, + ), + Container( + width: double.infinity, + margin: const EdgeInsets.symmetric(vertical: 20).w, + child: divider, + ), + _scene( + item, + isFrom: false, + languageName: controller.toLanguage.value.name, + index: index, + ), + ], + ), + ), + ); + }, + separatorBuilder: (context, index) { + return 12.verticalSpace; + }, + ); + } + + Widget _scene( + SceneList item, { + required bool isFrom, + required String languageName, + required int index, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + languageName, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: const Color(0xffC2C3C5), + fontSize: 12.sp, + fontWeight: FontWeight.w500, + ), + ), + 8.verticalSpace, + Row( + children: [ + Expanded( + child: Text( + controller.getSentence(isFrom, item), + style: TextStyle( + color: const Color(0xff152A3D), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + ), + GestureDetector( + onTap: () => + controller.playTranslationResults(isFrom, item, index), + child: ClipOval( + child: Container( + width: 24.w, + height: 24.w, + color: Color(controller.homeController.appColor.value) + .withOpacity(.2), + child: QudsAnimatedIcon( + color: Color(controller.homeController.appColor.value), + iconData: AnimatedIcons.pause_play, + showStartIcon: (isFrom + ? controller.isPlayingFrom.value + : controller.isPlayingTo.value) && + index == controller.playIndex.value, + ), + ), + ), + ), + ], + ), + ], + ); + } +} diff --git a/lib/pages/translated_text/components/language_text_bar.dart b/lib/pages/translated_text/components/language_text_bar.dart new file mode 100644 index 0000000..50df240 --- /dev/null +++ b/lib/pages/translated_text/components/language_text_bar.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/manager/translate.dart'; +import 'package:flutter_translate/pages/translated_text/translated_text_controller.dart'; +import 'package:get/get.dart'; + +class LanguageTextBar extends GetView { + const LanguageTextBar({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + _fromLanguage(), + _convertIcon(), + _toLanguage(), + ], + ); + } + + Widget _fromLanguage() { + return Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Flexible( + child: Text( + controller.isHistory + ? (controller.fromLanguageName ?? '') + : Translate().fromLanguageEntity.value.name, + style: const TextStyle( + color: Color(0xff435561), + fontSize: 14, + fontWeight: FontWeight.w500, + overflow: TextOverflow.ellipsis, + ), + ), + ), + ], + ), + ); + } + + Widget _convertIcon() { + return Container( + width: 26.w, + height: 18.w, + margin: const EdgeInsets.symmetric(horizontal: 10).w, + decoration: BoxDecoration( + color: const Color(0xff7FD5AA), + borderRadius: BorderRadius.circular(9), + ), + padding: const EdgeInsets.symmetric(vertical: 2, horizontal: 6).w, + child: Image.asset(Assets.iconConvert, color: Colors.white), + ); + } + + Widget _toLanguage() { + return Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Flexible( + child: Text( + controller.isHistory + ? (controller.toLanguageName ?? '') + : Translate().toLanguageEntity.value.name, + style: TextStyle( + color: const Color(0xff435561), + fontSize: 14.sp, + fontWeight: FontWeight.w500, + overflow: TextOverflow.ellipsis, + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/translated_text/translated_text_binding.dart b/lib/pages/translated_text/translated_text_binding.dart new file mode 100644 index 0000000..cb0dade --- /dev/null +++ b/lib/pages/translated_text/translated_text_binding.dart @@ -0,0 +1,9 @@ +import 'package:flutter_translate/pages/translated_text/translated_text_controller.dart'; +import 'package:get/get.dart'; + +class TranslatedTextBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => TranslatedTextController()); + } +} diff --git a/lib/pages/translated_text/translated_text_controller.dart b/lib/pages/translated_text/translated_text_controller.dart new file mode 100644 index 0000000..2256004 --- /dev/null +++ b/lib/pages/translated_text/translated_text_controller.dart @@ -0,0 +1,120 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_translate/common/hive/history_data.dart'; +import 'package:flutter_translate/common/utils/bot_toast.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; +import 'package:flutter_translate/common/utils/object_utils.dart'; +import 'package:flutter_translate/manager/translate.dart'; +import 'package:flutter_translate/manager/tts.dart'; +import 'package:flutter_translate/model/history_model.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:flutter_translate/pages/translator/translator_controller.dart'; +import 'package:get/get.dart'; +import 'package:translator/translator.dart'; + +class TranslatedTextController extends GetxController { + HomeController homeController = Get.find(); + var translator = GoogleTranslator(); + RxString sourceText = "".obs; + RxString targetText = "".obs; + var isTranslationCompleted = false.obs; + bool isHistory = false; + String? fromLanguageName; + String? toLanguageName; + String? fromLanguageCode; + String? toLanguageCode; + RxBool isPlayingFrom = false.obs; + RxBool isPlayingTo = false.obs; + + @override + void onInit() { + super.onInit(); + isHistory = Get.arguments['isHistory'] ?? false; + sourceText.value = Get.arguments['sourceText'] ?? ''; + targetText.value = Get.arguments['targetText'] ?? ''; + fromLanguageName = Get.arguments['fromLanguageName']; + toLanguageName = Get.arguments['toLanguageName']; + fromLanguageCode = Get.arguments['fromLanguageCode']; + toLanguageCode = Get.arguments['toLanguageCode']; + } + + @override + void onReady() { + super.onReady(); + if (isHistory) { + isTranslationCompleted.value = true; + } else { + translation(); + } + } + + Future translation() async { + if (ObjectUtils.isNotEmpty(sourceText.value)) { + try { + Translation translate = await translator.translate( + sourceText.value, + from: Translate().fromLanguageEntity.value.code, + to: Translate().toLanguageEntity.value.code, + ); + targetText.value = translate.text; + addHistory(); + } catch (e) { + toast('Translation failed'); + Log.d('Translation failed,${e.toString()}'); + } + isTranslationCompleted.value = true; + } + } + + void addHistory() { + final entity = HistoryModel( + sourceText: sourceText.value, + targetText: targetText.value, + sourceLanguageName: Translate().fromLanguageEntity.value.name, + sourceLanguageCode: Translate().fromLanguageEntity.value.code, + targetLanguageName: Translate().toLanguageEntity.value.name, + targetLanguageCode: Translate().toLanguageEntity.value.code, + ); + HistoryData().add(entity); + if (Get.isRegistered()) { + final controller = Get.find(); + controller.insertHistory(entity); + homeController.initHistoryList(); + } + } + + void onTextToSpeech(String text, String type) async { + isPlayingTo.value = false; + isPlayingFrom.value = false; + if (ObjectUtils.isNotEmpty(text)) { + String language = Translate().fromLanguageEntity.value.code; + switch (type) { + case "from": + isPlayingFrom.value = true; + language = fromLanguageCode ?? Translate().fromLanguageEntity.value.code; + await Tts().voiceTranslator(text, language); + isPlayingFrom.value = false; + break; + case "to": + isPlayingTo.value = true; + language = toLanguageCode ?? Translate().toLanguageEntity.value.code; + await Tts().voiceTranslator(text, language); + isPlayingTo.value = false; + break; + } + } + } + + void copyText({String? copyText}) { + if (ObjectUtils.isNotEmpty(targetText.value)) { + Clipboard.setData(ClipboardData(text: targetText.value)); + toast('Copied to clipboard'); + } + } + + void toFullScreen() { + // if (ObjectUtils.isNotEmpty(targetText.value)) { + // Get.to(() => const TTranslateTextFullScreenPage(), + // arguments: {"data": targetText.value}); + // } + } +} diff --git a/lib/pages/translated_text/translated_text_view.dart b/lib/pages/translated_text/translated_text_view.dart new file mode 100755 index 0000000..6b50072 --- /dev/null +++ b/lib/pages/translated_text/translated_text_view.dart @@ -0,0 +1,192 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/common/components/base_appbar.dart'; +import 'package:flutter_translate/common/utils/object_utils.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/global/app_general.dart'; +import 'package:flutter_translate/manager/translate.dart'; +import 'package:flutter_translate/pages/translated_text/components/language_text_bar.dart'; +import 'package:flutter_translate/pages/translated_text/translated_text_controller.dart'; +import 'package:get/get.dart'; +import 'package:quds_ui_kit/animations/quds_animated_icon.dart'; + +class TranslatedTextView extends GetView { + const TranslatedTextView({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Color(controller.homeController.appColor.value).withOpacity(0.2), + Colors.white, + ], + begin: const FractionalOffset(0, -7), + end: const FractionalOffset(0, 1), + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: const BaseAppbar( + backgroundColor: Colors.transparent, + titleWidget: Expanded(child: LanguageTextBar()), + ), + body: Obx( + () => ListView( + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20).w, + children: [ + _fromTranslate(), + Container( + margin: const EdgeInsets.symmetric(vertical: 20).w, + child: divider, + ), + _toTranslate(), + ], + ), + ), + ), + ); + } + + Widget _fromTranslate() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + Translate().fromLanguageEntity.value.name, + style: TextStyle( + color: const Color(0xff949494), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + 20.verticalSpace, + Text( + controller.sourceText.value, + style: TextStyle( + fontSize: 20.sp, + fontWeight: FontWeight.w600, + color: const Color(0xff152A3D), + ), + ), + 20.verticalSpace, + GestureDetector( + onTap: () => controller.onTextToSpeech( + controller.sourceText.value, + "from", + ), + child: ClipOval( + child: Container( + width: 32.w, + height: 32.w, + color: Color(controller.homeController.appColor.value), + child: QudsAnimatedIcon( + iconSize: 28.w, + color: Colors.white, + iconData: AnimatedIcons.pause_play, + showStartIcon: controller.isPlayingFrom.value, + ), + ), + ), + ), + ], + ); + } + + Widget _toTranslate() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Flexible( + child: Text( + Translate().toLanguageEntity.value.name, + style: TextStyle( + color: const Color(0xff949494), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + ), + 20.horizontalSpace, + Visibility( + visible: !controller.isTranslationCompleted.value, + child: SizedBox( + width: 20.w, + height: 20.w, + child: CircularProgressIndicator( + strokeWidth: 2, + color: Color(controller.homeController.appColor.value), + ), + ), + ), + ], + ), + 20.verticalSpace, + Text( + controller.targetText.value, + style: TextStyle( + fontSize: 20.sp, + fontWeight: FontWeight.w600, + color: const Color(0xff152A3D), + ), + ), + 20.verticalSpace, + Visibility( + visible: ObjectUtils.isNotEmptyStr(controller.targetText.value), + child: Row( + children: [ + GestureDetector( + onTap: () => controller.onTextToSpeech( + controller.targetText.value, + "to", + ), + child: ClipOval( + child: Container( + width: 32.w, + height: 32.w, + color: Color(controller.homeController.appColor.value), + child: QudsAnimatedIcon( + iconSize: 28.w, + color: Colors.white, + iconData: AnimatedIcons.pause_play, + showStartIcon: controller.isPlayingTo.value, + ), + ), + ), + ), + 16.horizontalSpace, + GestureDetector( + onTap: controller.copyText, + child: ClipOval( + child: Container( + width: 32.w, + height: 32.w, + color: const Color(0xffF4F4F6), + padding: const EdgeInsets.all(5).w, + child: Image.asset(Assets.iconCopy), + ), + ), + ), + // 16.horizontalSpace, + // GestureDetector( + // onTap: controller.toFullScreen, + // child: ClipOval( + // child: Container( + // width: 32.w, + // height: 32.w, + // color: const Color(0xffF4F4F6), + // padding: const EdgeInsets.all(5).w, + // child: Image.asset(Assets.iconFullScreen), + // ), + // ), + // ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/pages/translator/translator_binding.dart b/lib/pages/translator/translator_binding.dart new file mode 100644 index 0000000..738fb1a --- /dev/null +++ b/lib/pages/translator/translator_binding.dart @@ -0,0 +1,9 @@ +import 'package:flutter_translate/pages/translator/translator_controller.dart'; +import 'package:get/get.dart'; + +class TranslatorBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => TranslatorController()); + } +} diff --git a/lib/pages/translator/translator_controller.dart b/lib/pages/translator/translator_controller.dart new file mode 100644 index 0000000..9389483 --- /dev/null +++ b/lib/pages/translator/translator_controller.dart @@ -0,0 +1,157 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter_translate/ads/interstitial_ad_manage.dart'; +import 'package:flutter_translate/common/components/speak_alert.dart'; +import 'package:flutter_translate/common/hive/history_data.dart'; +import 'package:flutter_translate/common/utils/bot_toast.dart'; +import 'package:flutter_translate/common/utils/log_utils.dart'; +import 'package:flutter_translate/common/utils/object_utils.dart'; +import 'package:flutter_translate/common/utils/permission_utils.dart'; +import 'package:flutter_translate/manager/speech_convert.dart'; +import 'package:flutter_translate/manager/translate.dart'; +import 'package:flutter_translate/model/history_model.dart'; +import 'package:flutter_translate/pages/home/home_controller.dart'; +import 'package:flutter_translate/router/get_gages.dart'; +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:speech_to_text/speech_recognition_result.dart'; + +class TranslatorController extends GetxController { + var textController = TextEditingController(); + final FocusNode focusNode = FocusNode(); + HomeController homeController = Get.find(); + var isValue = false.obs; + var historyList = [].obs; + var lastWords = ''; + + @override + void onInit() { + super.onInit(); + historyList.value = HistoryData().findAll().reversed.toList(); + focusNode.requestFocus(); + } + + @override + void onClose() { + textController.dispose(); + super.onClose(); + } + + void onTapBack() { + focusNode.unfocus(); + InterstitialAdManager().showAdIfReady( + InterstitialAdManager().adIds[1], + onTap: () { + Get.back(); + }, + ); + } + + void onSpeakTranslation() { + if (isValue.value) { + textController.text = ""; + isValue.value = false; + } else { + speak(); + } + } + + Future speak() async { + bool micResult = await PermissionUtils.checkPermission( + [Permission.microphone], + ); + if (!micResult) return; + if (Platform.isIOS) { + bool speechResult = await PermissionUtils.checkPermission( + [Permission.speech], + ); + if (!speechResult) return; + } + await Get.dialog( + barrierDismissible: true, + useSafeArea: false, + SpeakAlert( + isListening: SpeechConvert().isListening, + onTap: () async { + if (!SpeechConvert().hasSpeech) { + await SpeechConvert().init(); + } + if (SpeechConvert().hasSpeech) { + if (SpeechConvert().isListening.value) { + _translatedText(); + } else { + SpeechConvert().start( + Translate().fromLanguageEntity.value.code, + (SpeechRecognitionResult result) { + Log.d('识别结果:${result.recognizedWords}'); + lastWords = result.recognizedWords; + }, + ); + } + } else { + Get.back(); + toast('Speech not available'); + } + }, + ), + ); + if (Get.isDialogOpen != null && !Get.isDialogOpen!) { + SpeechConvert().stop(); + } + } + + void _translatedText() { + if (ObjectUtils.isEmpty(lastWords)) { + toast('No text recognized'); + return; + } + Get.back(); + Get.toNamed( + GetPages.translateText, + arguments: {"sourceText": lastWords}, + ); + } + + void historyTranslate(HistoryModel historyModel) { + Get.toNamed( + GetPages.translateText, + arguments: { + 'isHistory': true, + 'sourceText': historyModel.sourceText, + 'targetText': historyModel.targetText, + 'fromLanguageName': historyModel.sourceLanguageName, + 'toLanguageName': historyModel.targetLanguageName, + 'fromLanguageCode': historyModel.sourceLanguageCode, + 'toLanguageCode': historyModel.targetLanguageCode, + }, + ); + } + + void removeHistoryByIndex(int index) { + // 计算原始列表中的对应索引 + int indexToRemoveFromDb = HistoryData().findAll().length - 1 - index; + historyList.removeAt(indexToRemoveFromDb); + HistoryData().remove(indexToRemoveFromDb); + } + + void changedText(String value) { + isValue.value = value.trim().isNotEmpty; + } + + void translatedText(String value) { + Get.toNamed( + GetPages.translateText, + arguments: {"sourceText": value}, + ); + } + + void insertHistory(HistoryModel entity) { + historyList.insert(0, entity); + } + + void dropHistory() { + historyList.clear(); + HistoryData().drop(); + } +} diff --git a/lib/pages/translator/translator_view.dart b/lib/pages/translator/translator_view.dart new file mode 100755 index 0000000..7657f28 --- /dev/null +++ b/lib/pages/translator/translator_view.dart @@ -0,0 +1,213 @@ +import 'package:custom_pop_up_menu/custom_pop_up_menu.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_translate/common/components/base_appbar.dart'; +import 'package:flutter_translate/common/components/common_language_selector_bar.dart'; +import 'package:flutter_translate/common/utils/object_utils.dart'; +import 'package:flutter_translate/generated/assets.dart'; +import 'package:flutter_translate/model/history_model.dart'; +import 'package:flutter_translate/pages/translator/translator_controller.dart'; +import 'package:get/get.dart'; + +class TranslatorView extends GetView { + const TranslatorView({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: BaseAppbar( + titleWidget: const Expanded(child: CommonLanguageSelectorBar()), + onBackTap: controller.onTapBack, + ), + body: Container( + padding: const EdgeInsets.symmetric(horizontal: 20).w, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 20.verticalSpace, + _translateInput(), + 20.verticalSpace, + _historyList(), + ], + ), + ), + ); + } + + Widget _translateInput() { + return Container( + decoration: BoxDecoration( + color: Color(controller.homeController.appColor.value), + borderRadius: BorderRadius.all(Radius.circular(16.r)), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: TextField( + textInputAction: TextInputAction.done, + textAlignVertical: TextAlignVertical.center, + textAlign: TextAlign.left, + controller: controller.textController, + maxLines: null, + minLines: 1, + focusNode: controller.focusNode, + // autofocus: true, + cursorColor: Colors.white, + style: TextStyle( + color: Colors.black, + fontSize: 20.sp, + height: 1.2, + ), + decoration: InputDecoration( + counterText: '', + isCollapsed: true, + contentPadding: const EdgeInsets.fromLTRB(20, 26, 4, 26).w, + border: InputBorder.none, + hintText: "Type to Translate", + hintStyle: TextStyle( + color: Colors.white, + fontSize: 20.sp, + ), + ), + onChanged: (value) => controller.changedText(value), + onSubmitted: (value) => controller.translatedText(value), + ), + ), + Obx( + () => Padding( + padding: EdgeInsets.only( + top: controller.isValue.value ? 26 : 20, + right: 20, + ).w, + child: GestureDetector( + onTap: controller.onSpeakTranslation, + child: ClipOval( + child: Visibility( + visible: controller.isValue.value, + replacement: Container( + width: 36.w, + height: 36.w, + color: Colors.white, + padding: EdgeInsets.all(5.w), + child: Image.asset(Assets.iconHomeMicrophone), + ), + child: Container( + width: 24.w, + height: 24.w, + color: Colors.white, + child: const Icon(Icons.close), + ), + ), + ), + ), + ), + ), + ], + ), + ); + } + + Widget _historyList() { + return Obx( + () => controller.historyList.isNotEmpty + ? Expanded( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "History", + style: TextStyle( + fontSize: 16.sp, + color: const Color(0xff979797), + fontWeight: FontWeight.w500, + ), + ), + IconButton( + onPressed: controller.dropHistory, + icon: Image.asset( + Assets.iconDelete, + width: 24.w, + ), + ), + ], + ), + Expanded( + child: ListView.builder( + itemCount: controller.historyList.length, + itemBuilder: (context, index) { + HistoryModel historyModel = + controller.historyList[index]; + return _historyItem(historyModel, index); + }, + ), + ), + ], + ), + ) + : Expanded(child: Container()), + ); + } + + Widget _historyItem(HistoryModel historyModel, int index) { + return CustomPopupMenu( + arrowColor: Colors.black, + barrierColor: Colors.transparent, + position: PreferredPosition.top, + verticalMargin: 0, + pressType: PressType.longPress, + menuBuilder: () { + return GestureDetector( + onTap: () => controller.removeHistoryByIndex(index), + child: Container( + padding: const EdgeInsets.all(10).w, + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(8.r), + ), + child: Image.asset(Assets.iconDelete, width: 24.w), + ), + ); + }, + child: InkWell( + onTap: () => controller.historyTranslate(historyModel), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 10).w, + child: RichText( + maxLines: 1, + overflow: TextOverflow.ellipsis, + text: TextSpan( + children: [ + TextSpan( + text: ObjectUtils.getStr(historyModel.sourceText), + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 16.sp, + color: const Color(0xff212121), + ), + ), + WidgetSpan(child: 6.horizontalSpace), + TextSpan( + text: ObjectUtils.getStr(historyModel.targetText), + style: TextStyle( + color: const Color(0xff979797), + fontSize: 13.sp, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/web/web_binding.dart b/lib/pages/web/web_binding.dart new file mode 100644 index 0000000..18a8aa2 --- /dev/null +++ b/lib/pages/web/web_binding.dart @@ -0,0 +1,9 @@ +import 'package:flutter_translate/pages/web/web_controller.dart'; +import 'package:get/get.dart'; + +class WebBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => WebController()); + } +} diff --git a/lib/pages/web/web_controller.dart b/lib/pages/web/web_controller.dart new file mode 100644 index 0000000..d1753fb --- /dev/null +++ b/lib/pages/web/web_controller.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_translate/common/components/view_state.dart'; +import 'package:get/get.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +class WebController extends GetxController { + var title = ''; + var url = ''; + late final WebViewController webViewController; + var viewState = ViewStateEnum.loading.obs; + + @override + void onInit() { + super.onInit(); + title = Get.arguments['title']; + url = Get.arguments['url'] ?? ''; + webViewController = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setBackgroundColor(Colors.white) + ..setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) { + // Update loading bar. + }, + onPageStarted: (String url) {}, + onPageFinished: (String url) { + viewState.value = ViewStateEnum.normal; + }, + onWebResourceError: (WebResourceError error) {}, + onNavigationRequest: (NavigationRequest request) { + return NavigationDecision.navigate; + }, + ), + ) + ..loadRequest(Uri.parse(url)); + } +} diff --git a/lib/pages/web/web_view.dart b/lib/pages/web/web_view.dart new file mode 100644 index 0000000..6bd2023 --- /dev/null +++ b/lib/pages/web/web_view.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_translate/common/components/base_appbar.dart'; +import 'package:flutter_translate/common/components/view_state.dart'; +import 'package:flutter_translate/pages/web/web_controller.dart'; +import 'package:get/get.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +class WebView extends GetView { + const WebView({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: BaseAppbar( + title: controller.title, + ), + body: Obx(() { + return ViewState( + viewStateEnum: controller.viewState.value, + child: WebViewWidget(controller: controller.webViewController), + ); + }), + ); + } +} diff --git a/lib/router/get_gages.dart b/lib/router/get_gages.dart new file mode 100644 index 0000000..378495e --- /dev/null +++ b/lib/router/get_gages.dart @@ -0,0 +1,88 @@ +import 'package:flutter_translate/pages/color_setting/color_setting_binding.dart'; +import 'package:flutter_translate/pages/color_setting/color_setting_view.dart'; +import 'package:flutter_translate/pages/face_to_face/face_to_face_binding.dart'; +import 'package:flutter_translate/pages/face_to_face/face_to_face_view.dart'; +import 'package:flutter_translate/pages/history/history_binding.dart'; +import 'package:flutter_translate/pages/history/history_view.dart'; +import 'package:flutter_translate/pages/home/home_binding.dart'; +import 'package:flutter_translate/pages/home/home_view.dart'; +import 'package:flutter_translate/pages/launch/launch_binding.dart'; +import 'package:flutter_translate/pages/launch/launch_view.dart'; +import 'package:flutter_translate/pages/scene_category/scene_category_binding.dart'; +import 'package:flutter_translate/pages/scene_category/scene_category_view.dart'; +import 'package:flutter_translate/pages/scene_list/scene_list_binding.dart'; +import 'package:flutter_translate/pages/scene_list/scene_list_view.dart'; +import 'package:flutter_translate/pages/translated_text/translated_text_binding.dart'; +import 'package:flutter_translate/pages/translated_text/translated_text_view.dart'; +import 'package:flutter_translate/pages/translator/translator_binding.dart'; +import 'package:flutter_translate/pages/translator/translator_view.dart'; +import 'package:flutter_translate/pages/web/web_binding.dart'; +import 'package:flutter_translate/pages/web/web_view.dart'; +import 'package:get/get.dart'; + +class GetPages { + static const launch = '/launch'; + static const home = '/home'; + static const sceneCategory = '/scene_category'; + static const sceneList = '/scene_list'; + static const faceToFace = '/face_to_face'; + static const history = '/history'; + static const translator = '/translator'; + static const translateText = '/translate_text'; + static const colorSetting = '/color_setting'; + + static const webView = '/web_view'; + + static List routers = [ + GetPage( + name: launch, + page: () => LaunchView(), + binding: LaunchBinding(), + ), + GetPage( + name: home, + page: () => const HomeView(), + binding: HomeBinding(), + ), + GetPage( + name: sceneCategory, + page: () => const SceneCategoryView(), + binding: SceneCategoryBinding(), + ), + GetPage( + name: sceneList, + page: () => const SceneListView(), + binding: SceneListBinding(), + ), + GetPage( + name: faceToFace, + page: () => const FaceToFaceView(), + binding: FaceToFaceBinding(), + ), + GetPage( + name: history, + page: () => const HistoryView(), + binding: HistoryBinding(), + ), + GetPage( + name: translator, + page: () => const TranslatorView(), + binding: TranslatorBinding(), + ), + GetPage( + name: translateText, + page: () => const TranslatedTextView(), + binding: TranslatedTextBinding(), + ), + GetPage( + name: colorSetting, + page: () => const ColorSettingView(), + binding: ColorSettingBinding(), + ), + GetPage( + name: webView, + page: () => const WebView(), + binding: WebBinding(), + ), + ]; +} diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..ac1ab7f --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,102 @@ +name: flutter_translate +description: "A new Flutter project." +publish_to: 'none' + +version: 1.0.3+6 + +environment: + sdk: '>=3.4.1 <4.0.0' + +dependencies: + flutter: + sdk: flutter + + cupertino_icons: ^1.0.6 + + flutter_screenutil: ^5.9.0 # 屏幕和字体大小适配 + + get: ^4.6.6 + + flutter_tts: ^4.0.2 + + translator: ^1.0.0 + + intl: ^0.19.0 + + image_picker: ^1.1.2 + + flutter_text_detect_area: ^0.0.1+5 + + hive: ^2.2.3 + hive_flutter: ^1.1.0 + + flutter_keyboard_visibility: ^6.0.0 # 对键盘可见性变化做出反应 + + custom_pop_up_menu: ^1.2.4 + + speech_to_text: ^6.6.2 + + devicelocale: ^0.7.1 # 获取设备当前语言 + + permission_handler: ^11.3.1 # 权限处理 + + app_tracking_transparency: ^2.0.5 # att + + webview_flutter: ^4.8.0 # webview + + wave: ^0.2.2 + + package_info_plus: ^8.0.0 # 查询应用程序包信息 + + device_info_plus: ^10.1.0 # 获取当前设备信息 + + logger: ^2.3.0 # 日志打印 + + bot_toast: ^4.1.3 # 提示框 + + quds_ui_kit: ^0.0.7+10 + + shared_preferences: ^2.2.1 # 持久化存储 + + fab_circular_menu_plus: ^0.0.2 + + pie_menu: ^3.2.1 + + # Firebase + firebase_core: ^3.2.0 + firebase_analytics: ^11.2.0 + firebase_crashlytics: ^4.0.3 + firebase_remote_config: ^5.0.3 + + # facebook + facebook_app_events: ^0.19.2 + + # 广告 + applovin_max: ^3.11.0 + + # 网络 + connectivity_plus: ^6.0.4 + +flutter_launcher_icons: + android: "launcher_icon" + ios: true + image_path: "assets/launcher/icon.png" + min_sdk_android: 23 # android min sdk min:16, default 21 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^3.0.0 + hive_generator: ^2.0.1 + build_runner: ^2.4.11 + flutter_launcher_icons: ^0.13.1 + +flutter: + + uses-material-design: true + assets: + - assets/launcher/ + - assets/images/ + - assets/icon/ + - assets/json/ + - assets/gif/