第一版

This commit is contained in:
fengshengxiong 2024-07-12 11:26:44 +08:00
parent c39a412706
commit 70d663706c
221 changed files with 13995 additions and 5906 deletions

View File

@ -22,8 +22,12 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0' flutterVersionName = '1.0'
} }
def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android { android {
namespace "com.lux.translator.translator_lux" namespace "com.translate.language.camera"
compileSdk flutter.compileSdkVersion compileSdk flutter.compileSdkVersion
ndkVersion flutter.ndkVersion ndkVersion flutter.ndkVersion
@ -34,20 +38,46 @@ android {
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.lux.translator.translator_lux" applicationId "com.translate.language.camera"
// You can update the following values to match your application needs. // You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 21 minSdkVersion 23
targetSdkVersion flutter.targetSdkVersion // targetSdkVersion flutter.targetSdkVersion
targetSdkVersion 33
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
} }
buildTypes { signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
debug {
signingConfig signingConfigs.release
}
release { release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works. // Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug signingConfig signingConfigs.release
ndk{
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a"
}
}
}
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
if (!variant.buildType.isDebuggable()) {
// APK输出文件名
outputFileName = "TransLark-${flutterVersionName}-${variant.buildType.name}.apk"
}
} }
} }
} }

View File

@ -1,16 +1,52 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<!-- Devices running Android 12L (API level 32) or lower -->
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<!-- Devices running Android 13 (API level 33) or higher -->
<uses-permission
android:name="android.permission.READ_MEDIA_IMAGES"
android:minSdkVersion="33" />
<queries>
<intent>
<action android:name="android.speech.RecognitionService" />
</intent>
</queries>
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
<application <application
android:enableOnBackInvokedCallback="true"
android:label="translator_lux"
android:name="${applicationName}" android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"> android:enableOnBackInvokedCallback="true"
android:icon="@mipmap/launcher_icon"
android:label="TransLark">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:exported="true" android:exported="true"
android:hardwareAccelerated="true"
android:launchMode="singleTop" android:launchMode="singleTop"
android:theme="@style/LaunchTheme" android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as <!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user the Android process has started. This theme is visible to the user
@ -18,11 +54,10 @@
to determine the Window background behind the Flutter UI. --> to determine the Window background behind the Flutter UI. -->
<meta-data <meta-data
android:name="io.flutter.embedding.android.NormalTheme" android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" android:resource="@style/NormalTheme" />
/>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Don't delete the meta-data below. <!-- Don't delete the meta-data below.
@ -38,8 +73,8 @@
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. --> In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries> <queries>
<intent> <intent>
<action android:name="android.intent.action.PROCESS_TEXT"/> <action android:name="android.intent.action.PROCESS_TEXT" />
<data android:mimeType="text/plain"/> <data android:mimeType="text/plain" />
</intent> </intent>
</queries> </queries>
</manifest> </manifest>

View File

@ -1,4 +1,4 @@
package com.lux.translator.translator_lux; package com.translate.language.camera;
import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.android.FlutterActivity;

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen --> <!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" /> <item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here --> <!-- You can insert your own image assets here -->
<!-- <item> <item>
<bitmap <bitmap
android:gravity="center" android:gravity="fill"
android:src="@mipmap/launch_image" /> android:src="@mipmap/launch_image" />
</item> --> </item>
</layer-list> </layer-list>

View File

@ -4,9 +4,9 @@
<item android:drawable="@android:color/white" /> <item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here --> <!-- You can insert your own image assets here -->
<!-- <item> <item>
<bitmap <bitmap
android:gravity="center" android:gravity="fill"
android:src="@mipmap/launch_image" /> android:src="@mipmap/launch_image" />
</item> --> </item>
</layer-list> </layer-list>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>
</resources>

View File

@ -5,6 +5,7 @@
<!-- Show a splash screen on the activity. Automatically removed when <!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame --> the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item> <item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:windowFullscreen">true</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your This theme determines the color of the Android Window while your

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>
</resources>

View File

@ -5,6 +5,7 @@
<!-- Show a splash screen on the activity. Automatically removed when <!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame --> the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item> <item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:windowFullscreen">true</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your This theme determines the color of the Android Window while your

BIN
assets/images/appbar_back.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 B

View File

Before

Width:  |  Height:  |  Size: 590 B

After

Width:  |  Height:  |  Size: 590 B

View File

Before

Width:  |  Height:  |  Size: 648 B

After

Width:  |  Height:  |  Size: 648 B

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 656 B

After

Width:  |  Height:  |  Size: 656 B

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

View File

Before

Width:  |  Height:  |  Size: 749 B

After

Width:  |  Height:  |  Size: 749 B

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
assets/images/star.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 B

View File

Before

Width:  |  Height:  |  Size: 435 B

After

Width:  |  Height:  |  Size: 435 B

View File

Before

Width:  |  Height:  |  Size: 544 B

After

Width:  |  Height:  |  Size: 544 B

View File

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

136
assets/json/language.json Normal file
View File

@ -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"}
]

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

10
assets/svg/daily_greetings.svg Executable file
View File

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="55" height="54" viewBox="0 0 55 54" fill="none">
<g clip-path="url(#clip0_561_93)">
<path d="M42.2012 9.33108L12.9841 19.9652C8.83821 21.4798 6.69814 26.0692 8.20777 30.2169L15.5846 50.4845C17.0992 54.6304 21.6836 56.7723 25.8331 55.2676L40.0254 50.102L48.3919 53.1682L46.5021 47.7447L55.0502 44.6334C59.1961 43.1188 61.3361 38.5295 59.8265 34.3818L52.4497 14.1141C50.94 9.96647 46.3556 7.8246 42.2012 9.33108ZM39.2738 37.6142C39.4952 38.1453 39.4084 38.7549 39.0436 39.2019C38.6788 39.649 38.099 39.86 37.5322 39.752C36.9654 39.6441 36.5071 39.2329 36.3352 38.6837L34.3711 33.2873L28.494 35.4264L30.4563 40.8178C30.6777 41.349 30.5909 41.9586 30.2261 42.4056C29.8613 42.8527 29.2815 43.0637 28.7147 42.9557C28.1479 42.8478 27.6896 42.4365 27.5178 41.8874L22.8788 29.1421C22.6575 28.611 22.7443 28.0013 23.1091 27.5543C23.4739 27.1073 24.0536 26.8962 24.6205 27.0042C25.1873 27.1122 25.6456 27.5234 25.8174 28.0725L27.4226 32.4828L33.2997 30.3437L31.6945 25.9334C31.4732 25.4023 31.5599 24.7927 31.9247 24.3457C32.2895 23.8986 32.8693 23.6876 33.4361 23.7956C34.0029 23.9035 34.4613 24.3147 34.6331 24.8639L39.2738 37.6142ZM45.1509 35.4751C45.379 36.0093 45.2941 36.6239 44.9311 37.0759C44.5681 37.5279 43.9833 37.7407 43.4147 37.6278C42.8461 37.5149 42.386 37.0987 42.2173 36.5428L39.7175 29.6746C39.4217 28.8619 39.8359 27.9648 40.6486 27.669C41.4613 27.3732 42.3603 27.7924 42.6561 28.6051L45.1559 35.4733L45.1509 35.4751ZM41.0027 24.5097C40.8948 25.0765 40.4835 25.5348 39.9344 25.7066C39.1325 25.9704 38.2651 25.5454 37.9765 24.7525C37.6879 23.9596 38.081 23.0814 38.8648 22.7681C39.396 22.5467 40.0074 22.6384 40.4526 22.9983C40.8997 23.3631 41.1107 23.9429 41.0027 24.5097Z" fill="#7E80E2"/>
</g>
<defs>
<clipPath id="clip0_561_93">
<rect width="54" height="54" fill="white" transform="translate(0.393555 18.8629) rotate(-20)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

10
assets/svg/dinning.svg Executable file
View File

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="55" height="54" viewBox="0 0 55 54" fill="none">
<g clip-path="url(#clip0_594_1444)">
<path d="M19.6982 52.414L57.9578 38.4886C58.3214 38.3584 58.6526 38.1511 58.9285 37.8809C59.2044 37.6107 59.4186 37.284 59.5563 36.9232C59.8809 36.1493 59.8931 35.35 59.5939 34.5278C59.3282 33.7422 58.7651 33.0921 58.0254 32.717C57.6879 32.5292 57.3137 32.4163 56.9286 32.3862C56.5434 32.3561 56.1563 32.4095 55.7937 32.5426L55.5479 32.6321C53.6681 28.9203 50.7841 25.8108 47.2241 23.6574C43.6506 21.4876 39.8773 20.4855 35.9054 20.6629L35.8865 20.611C35.8238 20.2349 35.7611 19.9607 35.6965 19.7832C35.0961 18.1335 34.0575 16.9371 32.575 16.1869C31.8888 15.8195 31.1321 15.6029 30.3554 15.5516C29.5787 15.5004 28.8001 15.6157 28.0716 15.8897C26.5475 16.4444 25.4679 17.4808 24.8346 19.0042C24.2013 20.5276 24.1784 22.1134 24.7769 23.7576C24.8415 23.9351 24.9603 24.2105 25.1305 24.5847C21.9792 26.9998 19.7301 30.1939 18.3873 34.1531C17.0466 38.1177 16.8434 42.1911 17.7771 46.3795L17.5313 46.469C17.1712 46.6027 16.8446 46.8134 16.5744 47.0864C16.2988 47.3577 16.08 47.6812 15.931 48.0381C15.7807 48.3898 15.7011 48.7745 15.6915 49.1986C15.681 49.62 15.7504 50.0402 15.9035 50.4608C16.1977 51.2692 16.7159 51.8601 17.462 52.2443C18.2053 52.6295 18.9525 52.6854 19.6982 52.414ZM29.1397 18.8415C29.8854 18.5701 30.6281 18.6307 31.3732 19.0122C32.1166 19.3974 32.6367 19.9937 32.929 20.7967L32.9867 20.9551L32.9581 21.0212C32.0237 21.2026 31.1052 21.4583 30.2114 21.7858C29.3186 22.1154 28.4511 22.5097 27.6157 22.9656L27.5514 22.9334L27.4938 22.7749C27.1995 21.9665 27.2167 21.1808 27.5385 20.4079C27.6769 20.0469 27.8917 19.7201 28.168 19.4498C28.4444 19.1795 28.7758 18.972 29.1397 18.8415ZM23.3947 38.8601C23.6994 37.0251 24.3334 35.2602 25.266 33.6507C26.1792 32.0651 27.4083 30.6839 28.8772 29.5928C28.9241 29.5362 28.9856 29.4935 29.055 29.4693C29.1207 29.4095 29.1966 29.362 29.2792 29.3289C29.667 29.1878 30.0549 29.2167 30.4374 29.4177C30.8253 29.6168 31.0911 29.9221 31.2442 30.3428C31.3337 30.5886 31.367 30.8332 31.3452 31.0793C31.3251 31.319 31.2496 31.5509 31.1247 31.7565C31.012 31.9492 30.8526 32.1104 30.6612 32.2252C28.3729 34.0038 26.8202 36.5632 26.2998 39.4143C26.2992 39.6098 26.26 39.8033 26.1845 39.9837C26.1089 40.164 25.9985 40.3277 25.8595 40.4653C25.717 40.5979 25.549 40.7 25.3657 40.7657C25.1844 40.8364 24.99 40.8671 24.7957 40.8555C24.6014 40.844 24.412 40.7906 24.2403 40.6989C23.8741 40.5065 23.5973 40.179 23.4687 39.7858C23.3497 39.4917 23.3248 39.168 23.3974 38.8591L23.3947 38.8601ZM59.0315 41.4384L20.7718 55.3638C20.4076 55.4937 20.0759 55.701 19.7995 55.9714C19.5231 56.2418 19.3085 56.5689 19.1706 56.9302C18.848 57.6934 18.8355 58.5522 19.1358 59.3245C19.436 60.1494 19.9547 60.7586 20.7015 61.1363C21.4503 61.5195 22.1931 61.5801 22.936 61.3097L61.1956 47.3844C61.5592 47.2542 61.8903 47.0469 62.1663 46.7767C62.4422 46.5064 62.6564 46.1797 62.7941 45.8189C63.1187 45.0451 63.1299 44.243 62.8317 43.4236C62.566 42.638 62.0029 41.9878 61.2632 41.6128C60.926 41.4238 60.5519 41.3103 60.1665 41.2802C59.7812 41.2501 59.3939 41.3041 59.0315 41.4384Z" fill="#EF7F3D"/>
</g>
<defs>
<clipPath id="clip0_594_1444">
<rect width="54" height="54" fill="white" transform="translate(0.393555 18.8628) rotate(-20)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

3
assets/svg/ears.svg Executable file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="39" height="61" viewBox="0 0 39 61" fill="none">
<path d="M28.0766 3.26905C10.4279 -11.4076 2.52934 35.384 0.786141 60.6143L20.7771 60.0138L28.8422 28.7577C35.9406 26.3768 45.7252 17.9457 28.0766 3.26905Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 278 B

3
assets/svg/face_voice.svg Executable file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path d="M12.0002 1C13.3263 1 14.598 1.52678 15.5357 2.46447C16.4734 3.40215 17.0002 4.67392 17.0002 6V10C17.0002 10.6566 16.8708 11.3068 16.6196 11.9134C16.3683 12.52 16 13.0712 15.5357 13.5355C15.0714 13.9998 14.5202 14.3681 13.9136 14.6194C13.307 14.8707 12.6568 15 12.0002 15C11.3436 15 10.6934 14.8707 10.0868 14.6194C9.48013 14.3681 8.92893 13.9998 8.46464 13.5355C8.00035 13.0712 7.63205 12.52 7.38078 11.9134C7.1295 11.3068 7.00018 10.6566 7.00018 10V6C7.00018 4.67392 7.52696 3.40215 8.46464 2.46447C9.40232 1.52678 10.6741 1 12.0002 1ZM3.05518 11H5.07018C5.31247 12.6648 6.14604 14.1867 7.41841 15.2873C8.69077 16.3879 10.3169 16.9936 11.9992 16.9936C13.6815 16.9936 15.3076 16.3879 16.5799 15.2873C17.8523 14.1867 18.6859 12.6648 18.9282 11H20.9442C20.7168 13.0287 19.8068 14.9199 18.3634 16.3635C16.92 17.8071 15.0289 18.7174 13.0002 18.945V23H11.0002V18.945C8.97131 18.7176 7.07996 17.8074 5.63635 16.3638C4.19274 14.9202 3.28259 13.0289 3.05518 11Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

10
assets/svg/family.svg Executable file
View File

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="55" height="54" viewBox="0 0 55 54" fill="none">
<g clip-path="url(#clip0_594_1588)">
<path d="M58.5516 21.8102L29.173 14.3522C28.6532 14.2118 28.1027 14.2353 27.5967 14.4194C27.0907 14.6036 26.6539 14.9395 26.3459 15.3812L20.7691 23.0426L18.9037 17.9175C18.6056 17.0984 17.7091 16.6653 16.9117 16.9555L11.1124 19.0663C10.3187 19.3552 9.91031 20.2632 10.2071 21.0787L14.2044 32.061L8.46088 39.9637C8.1789 40.3168 8.26999 40.7926 8.62696 41.0854C8.85604 41.2525 9.1253 41.3268 9.34277 41.2477C9.48775 41.1949 9.60635 41.0697 9.64981 40.9635L11.5669 38.3366L21.1141 64.5673C21.8727 66.6514 24.0651 67.7128 26.0912 66.9754L62.3184 53.7898C64.3445 53.0523 65.3417 50.83 64.5831 48.7459L55.0504 22.555L58.2195 23.3677C58.6624 23.4569 59.0687 23.231 59.1539 22.7772C59.2342 22.3211 58.9971 21.9066 58.5516 21.8102ZM47.0618 39.3447L43.0363 48.9453C42.8475 49.4301 42.5557 49.8681 42.1811 50.2291C41.8065 50.5901 41.358 50.8655 40.8666 51.0362C39.8336 51.4122 38.7267 51.3143 37.7771 50.8595L28.8845 46.2644C28.1811 45.8998 27.5579 45.3978 27.0518 44.7881C26.5458 44.1784 26.1672 43.4734 25.9384 42.7148C25.0205 39.9335 26.1864 36.6974 28.732 35.3686C29.7761 34.7986 30.9656 34.5509 32.1504 34.6566C33.3351 34.7624 34.462 35.2169 35.3885 35.9628C35.539 35.3047 35.7777 34.6185 36.0784 34.1027C36.9541 32.4827 38.6005 31.3786 40.3704 31.1326C41.554 30.9722 42.7587 31.1643 43.8337 31.6849C44.9088 32.2055 45.8065 33.0314 46.4147 34.0594C47.3955 35.7055 47.6696 37.5185 47.0618 39.3447Z" fill="#F3D216"/>
</g>
<defs>
<clipPath id="clip0_594_1588">
<rect width="54" height="54" fill="white" transform="translate(0.393555 18.8629) rotate(-20)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

10
assets/svg/healthy.svg Executable file
View File

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="55" height="54" viewBox="0 0 55 54" fill="none">
<g clip-path="url(#clip0_561_81)">
<path d="M25.2208 37.8424L14.0525 41.9074C11.7677 40.0812 10.0327 37.499 9.28883 34.3446C7.81749 28.1087 11.0016 21.5635 16.8106 18.8605C21.1213 16.8545 25.8371 17.2716 29.5565 19.4561C30.8614 15.7859 33.7147 12.6978 37.6357 11.2246C44.4475 8.66507 52.2241 11.9959 55.053 18.7009C56.2208 21.4686 56.4008 24.3754 55.7811 27.0649L39.9915 32.8118C39.5994 32.9545 39.3399 33.3294 39.3447 33.747L39.3909 37.8616L25.0968 29.5435C24.3019 29.0811 23.3634 29.8655 23.678 30.73L25.8082 36.5827C25.9943 37.0922 25.7311 37.6567 25.2208 37.8424ZM40.9197 42.1836L28.3416 34.8648L29.6122 38.3555C29.7979 38.8659 29.5347 39.4303 29.0244 39.6161L17.3585 43.8621C17.4583 43.9035 17.5567 43.9485 17.6575 43.9876L42.742 55.6847L54.3767 30.734L42.9825 34.8812C42.5904 35.0239 42.3308 35.3988 42.3357 35.8164L42.3971 41.3231C42.4058 42.0861 41.5793 42.5676 40.9197 42.1836Z" fill="#11C2B2"/>
</g>
<defs>
<clipPath id="clip0_561_81">
<rect width="54" height="54" fill="white" transform="translate(0.393555 18.8629) rotate(-20)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

4
assets/svg/make_friends.svg Executable file
View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="47" height="46" viewBox="0 0 47 46" fill="none">
<path d="M50.7059 32.2623C50.417 31.1823 49.4072 29.1087 47.3768 27.9423C46.0889 27.2025 44.5958 26.9541 43.0109 27.2052C41.993 25.4664 40.0139 23.9058 36.9332 23.9274C34.8137 23.9436 32.9291 24.8994 31.625 26.6166C30.0509 28.6902 29.4353 31.725 30.0968 34.1712C30.8879 37.098 31.7087 39.0231 34.757 43.3836L35.3996 44.3016L36.5093 44.1477C42.1064 43.3728 45.044 42.0012 47.3849 40.6323C50.6195 38.745 51.5078 34.9245 50.7059 32.2623Z" fill="#FFB5CC"/>
<path d="M40.8568 8.2053C39.1423 7.1334 34.7926 5.4324 30.3025 6.5043C27.0166 7.29 24.3112 9.3447 22.2538 12.6171C18.3091 10.8675 12.5716 10.7811 7.75207 15.6168C4.46077 18.9189 2.97847 22.842 3.46717 26.9595C4.16377 32.8455 8.53237 37.4652 12.0613 39.636C17.4505 42.9489 22.8316 44.9145 33.3913 47.1771L30.9775 43.362C22.6588 30.78 28.7662 22.3479 34.7629 21.0303C41.413 19.5696 44.5018 24.4296 44.5018 24.4296L47.4043 24.6591C49.4887 17.5851 45.5926 10.9134 40.8568 8.2053ZM14.2834 33.7581C9.29107 28.593 8.56207 23.814 12.118 19.5534L15.0205 21.9753C13.9864 23.2119 11.8399 25.7877 17.0023 31.131L14.2834 33.7581Z" fill="#FFB5CC"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

5
assets/svg/rotate.svg Executable file
View File

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path d="M16.275 22.5H4.575C3.08672 22.5 1.875 21.2906 1.875 19.807V10.8281C1.875 9.34219 3.08672 8.13515 4.575 8.13515H16.275C17.7633 8.13515 18.975 9.34453 18.975 10.8281V19.807C18.975 21.2906 17.7633 22.5 16.275 22.5ZM4.575 9.93047C4.07812 9.93047 3.675 10.3336 3.675 10.8281V19.807C3.675 20.3016 4.07812 20.7047 4.575 20.7047H16.275C16.7719 20.7047 17.175 20.3016 17.175 19.807V10.8281C17.175 10.3336 16.7719 9.93047 16.275 9.93047H4.575Z" fill="white"/>
<path d="M21.2248 10.5539C20.8779 10.5539 20.5475 10.3523 20.3998 10.0148C18.4826 5.64375 13.8912 4.99219 11.3248 4.99219C10.8279 4.99219 10.4248 4.58906 10.4248 4.09453C10.4248 3.6 10.8279 3.19688 11.3248 3.19688C16.4389 3.19688 20.3482 5.4211 22.0498 9.29766C22.249 9.75235 22.0404 10.282 21.5857 10.4813C21.4686 10.5305 21.3443 10.5539 21.2248 10.5539Z" fill="white"/>
<path d="M11.0999 6.68906C10.8702 6.68906 10.6382 6.60234 10.4624 6.42656L8.76318 4.72968C8.41162 4.37812 8.41162 3.81093 8.76318 3.45937L10.4624 1.7625C10.814 1.41093 11.3835 1.41093 11.7351 1.7625C12.0866 2.11406 12.0866 2.68125 11.7351 3.03281L10.671 4.09453L11.7351 5.15625C12.0866 5.50781 12.0866 6.075 11.7351 6.42656C11.5616 6.6 11.3296 6.68906 11.0999 6.68906Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

3
assets/svg/shopping.svg Executable file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="55" height="54" viewBox="0 0 55 54" fill="none">
<path d="M45.9554 21.7243L42.256 23.1167C40.3328 18.0072 34.6297 15.4191 29.5253 17.3403C24.4209 19.2615 21.8397 24.9678 23.7628 30.0772L20.0634 31.4697C18.0297 32.2351 17.0115 34.5212 17.7781 36.5579L26.1204 58.7834C26.4917 59.7634 27.2359 60.5567 28.1903 60.9897C29.1447 61.4228 30.2317 61.4604 31.2137 61.0944L57.1047 51.3494C58.0844 50.9771 58.8768 50.232 59.3088 49.2771C59.7408 48.3223 59.7773 47.2352 59.4102 46.2536L51.0481 24.0367C50.6768 23.0567 49.9326 22.2634 48.9782 21.8304C48.0238 21.3973 46.9368 21.3597 45.9548 21.7257L45.9554 21.7243ZM30.9189 21.0428C31.648 20.7676 32.4242 20.639 33.2031 20.6643C33.9819 20.6896 34.7482 20.8683 35.4578 21.1903C36.1675 21.5122 36.8067 21.971 37.3388 22.5404C37.8709 23.1098 38.2854 23.7785 38.5585 24.5084L27.4602 28.6856C27.1844 27.9568 27.0551 27.1807 27.0797 26.4018C27.1043 25.6229 27.2823 24.8565 27.6036 24.1465C27.9249 23.4365 28.3831 22.7969 28.952 22.2643C29.5209 21.7317 30.1893 21.3166 30.9189 21.0428ZM37.8878 39.5581C32.7834 41.4794 27.0803 38.8912 25.1564 33.7797L28.8548 32.3877C29.1279 33.1177 29.5423 33.7866 30.0744 34.3561C30.6064 34.9256 31.2457 35.3845 31.9554 35.7066C32.6651 36.0286 33.4314 36.2074 34.2104 36.2328C34.9894 36.2581 35.7657 36.1295 36.4949 35.8543C37.2242 35.5802 37.8923 35.165 38.4609 34.6324C39.0295 34.0998 39.4875 33.4602 39.8085 32.7503C40.1296 32.0405 40.3075 31.2742 40.332 30.4955C40.3566 29.7168 40.2272 28.9409 39.9515 28.2122L43.6509 26.8198C45.5744 31.9303 42.9922 37.6369 37.8878 39.5581Z" fill="#2A38CC"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

3
assets/svg/speaker_white.svg Executable file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
<path d="M15.6448 3.57501C16.4958 4.41471 17.1714 5.41508 17.6325 6.51802C18.0937 7.62097 18.3312 8.80454 18.3312 10C18.3312 11.1955 18.0937 12.379 17.6325 13.482C17.1714 14.5849 16.4958 15.5853 15.6448 16.425C15.5676 16.5042 15.4754 16.5672 15.3736 16.6104C15.2717 16.6536 15.1623 16.6761 15.0517 16.6766C14.9411 16.677 14.8315 16.6555 14.7293 16.6131C14.6271 16.5708 14.5343 16.5085 14.4564 16.43C14.3786 16.3514 14.3171 16.2582 14.2756 16.1556C14.2342 16.0531 14.2135 15.9433 14.2149 15.8327C14.2163 15.7221 14.2397 15.6128 14.2838 15.5114C14.3278 15.4099 14.3917 15.3182 14.4715 15.2417C15.1662 14.5569 15.7179 13.7409 16.0944 12.841C16.4709 11.9412 16.6648 10.9755 16.6648 10C16.6648 9.02456 16.4709 8.05883 16.0944 7.15898C15.7179 6.25913 15.1662 5.44311 14.4715 4.75834C14.3917 4.68179 14.3278 4.59011 14.2838 4.48864C14.2397 4.38718 14.2163 4.27795 14.2149 4.16735C14.2135 4.05674 14.2342 3.94696 14.2756 3.84441C14.3171 3.74186 14.3786 3.64859 14.4564 3.57004C14.5343 3.49149 14.6271 3.42923 14.7293 3.3869C14.8315 3.34456 14.9411 3.323 15.0517 3.32346C15.1623 3.32393 15.2717 3.34641 15.3736 3.38959C15.4754 3.43278 15.5676 3.49581 15.6448 3.57501ZM8.649 3.57084C8.77184 3.47352 8.91964 3.41281 9.07542 3.39568C9.2312 3.37855 9.38866 3.4057 9.52971 3.474C9.67077 3.54231 9.7897 3.64901 9.87285 3.78185C9.95601 3.91469 10 4.06829 9.99984 4.22501V15.7767C9.99974 15.9332 9.95558 16.0865 9.8724 16.2191C9.78922 16.3516 9.67039 16.4581 9.52952 16.5263C9.38864 16.5945 9.23142 16.6216 9.07584 16.6046C8.92027 16.5875 8.77263 16.527 8.64984 16.43L4.709 13.3083H2.49984C2.29573 13.3083 2.09872 13.2334 1.94619 13.0977C1.79366 12.9621 1.69622 12.7752 1.67234 12.5725L1.6665 12.475V7.52501C1.6665 7.304 1.7543 7.09204 1.91058 6.93575C2.06686 6.77947 2.27882 6.69168 2.49984 6.69168L4.70984 6.69084L8.649 3.57084ZM8.33317 5.94668L5.5165 8.17834C5.36945 8.29478 5.18741 8.3582 4.99984 8.35834L3.33317 8.35751V11.6417H4.99984C5.14941 11.6417 5.29621 11.682 5.42484 11.7583L5.5165 11.8217L8.33317 14.0525V5.94668ZM12.7032 6.48751C13.1677 6.9461 13.5365 7.49236 13.7882 8.09461C14.04 8.69686 14.1696 9.3431 14.1696 9.99584C14.1696 10.6486 14.04 11.2948 13.7882 11.8971C13.5365 12.4993 13.1677 13.0456 12.7032 13.5042C12.6259 13.5834 12.5337 13.6464 12.4319 13.6896C12.3301 13.7328 12.2206 13.7553 12.11 13.7557C11.9994 13.7562 11.8898 13.7346 11.7876 13.6923C11.6854 13.65 11.5927 13.5877 11.5148 13.5091C11.4369 13.4306 11.3754 13.3373 11.334 13.2348C11.2925 13.1322 11.2719 13.0224 11.2733 12.9118C11.2747 12.8012 11.2981 12.692 11.3421 12.5905C11.3862 12.4891 11.45 12.3974 11.5298 12.3208C11.8381 12.0172 12.083 11.6553 12.2501 11.2561C12.4172 10.857 12.5033 10.4286 12.5033 9.99584C12.5033 9.56312 12.4172 9.13472 12.2501 8.73557C12.083 8.33642 11.8381 7.97449 11.5298 7.67084C11.45 7.59429 11.3862 7.50261 11.3421 7.40114C11.2981 7.29968 11.2747 7.19045 11.2733 7.07985C11.2719 6.96924 11.2925 6.85946 11.334 6.75691C11.3754 6.65436 11.4369 6.56109 11.5148 6.48254C11.5927 6.40399 11.6854 6.34173 11.7876 6.2994C11.8898 6.25706 11.9994 6.2355 12.11 6.23596C12.2206 6.23643 12.3301 6.25891 12.4319 6.30209C12.5337 6.34528 12.6259 6.40831 12.7032 6.48751Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

10
assets/svg/study.svg Executable file
View File

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="55" height="54" viewBox="0 0 55 54" fill="none">
<g clip-path="url(#clip0_561_61)">
<path d="M53.5353 19.6016L56.3788 27.4141L58.9456 28.9278L56.6382 33.296L52.3388 31.3325L53.4361 28.4391L51.0757 21.9541C42.4813 29.9783 40.2108 32.3574 38.335 34.217C36.4582 36.077 34.8365 36.6673 32.2638 36.6153C29.7296 36.5492 18.0945 36.219 11.8408 35.5299C7.68389 35.0661 7.03788 34.0301 10.3306 31.1376C14.605 27.3705 21.209 21.3902 24.9416 18.102C27.1199 16.0851 28.2925 14.9998 31.1051 15.3414C36.0044 15.6281 46.5441 16.0272 52.1273 16.3489C57.0173 16.7333 54.4353 18.3799 53.5353 19.6016ZM40.0284 37.2716C42.103 35.3396 44.7914 32.3843 47.8412 29.44L52.5297 42.3217C52.5297 42.3217 49.7371 49.1743 41.4679 52.1841C32.6061 55.4095 25.9422 51.9988 25.9422 51.9988L21.5558 39.9472C24.7897 40.0884 28.2923 39.9893 32.5739 39.9366C35.2422 40.002 38.3154 39.2122 40.0284 37.2716Z" fill="#469D68"/>
</g>
<defs>
<clipPath id="clip0_561_61">
<rect width="54" height="54" fill="white" transform="translate(0.393555 18.8629) rotate(-20)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

10
assets/svg/transportation.svg Executable file
View File

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="55" height="54" viewBox="0 0 55 54" fill="none">
<g clip-path="url(#clip0_561_124)">
<path d="M59.4543 43.3488L47.3076 13.2568C46.3151 10.5299 43.1499 9.1785 40.2382 10.2383L14.9312 19.4493C12.0195 20.5091 10.4636 23.5788 11.4561 26.3058L21.4939 57.1653L25.1484 55.8352C25.1726 55.9842 25.2078 56.1332 25.2614 56.2804L25.6262 57.2827C26.0866 58.5477 27.4855 59.2 28.7506 58.7396L32.0436 57.541C33.3088 57.0805 33.961 55.6816 33.5006 54.4166L33.1358 53.4144C33.0822 53.2672 33.0135 53.1304 32.9362 53.0007L48.0122 47.5134C48.0364 47.6624 48.0716 47.8115 48.1252 47.9587L48.49 48.9609C48.9504 50.226 50.3493 50.8783 51.6145 50.4178L54.9074 49.2192C56.1725 48.7588 56.8249 47.3598 56.3645 46.0948L55.9997 45.0926C55.9462 44.9455 55.8773 44.8086 55.8001 44.6789L59.4543 43.3488ZM26.2621 50.0218C24.6633 50.6037 22.8952 49.7793 22.3133 48.1803C21.7313 46.5814 22.5557 44.8134 24.1546 44.2314C25.7537 43.6494 27.5215 44.4739 28.1035 46.0729C28.6855 47.6718 27.8612 49.4398 26.2621 50.0218ZM20.3863 40.2583L16.225 27.6043C15.2207 24.8451 15.8283 23.3879 18.3685 22.4634L39.5286 14.7617C42.0687 13.8372 43.4708 14.5629 44.4751 17.3221L49.4352 29.6854L20.3863 40.2583ZM51.2099 40.9415C49.611 41.5235 47.8429 40.699 47.261 39.1001C46.679 37.5011 47.5034 35.7331 49.1024 35.1511C50.7014 34.5691 52.4694 35.3936 53.0514 36.9925C53.6333 38.5915 52.8089 40.3595 51.2099 40.9415Z" fill="#1B82DE"/>
</g>
<defs>
<clipPath id="clip0_561_124">
<rect width="54" height="54" fill="white" transform="translate(0.393555 18.8629) rotate(-20)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

10
assets/svg/travel.svg Executable file
View File

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="52" height="47" viewBox="0 0 52 47" fill="none">
<g clip-path="url(#clip0_561_135)">
<path d="M52.6972 31.2534C55.1724 33.2334 55.0138 35.908 54.7839 37.1211C54.7238 37.4331 54.4206 37.5468 54.219 37.3358C53.2657 36.3422 50.7684 33.8949 48.3841 32.803C48.6452 34.6254 48.8939 37.9624 48.0856 41.831C52.8478 43.3255 56.9139 46.0004 59.7318 49.5199C52.1277 46.3895 44.1194 48.6728 34.8343 53.6909C27.8054 57.4892 20.0944 58.6625 12.0578 57.2741C14.607 50.5068 20.8866 44.7584 29.1379 42.0816C23.5301 34.7032 21.4661 27.0069 20.7153 22.6242C15.8578 25.1574 11.3839 30.0833 9.77284 31.9783C9.43674 32.3718 8.81093 32.3342 8.5381 31.9056C7.30549 29.9805 4.97829 25.0483 9.60315 20.4191C11.6387 18.3835 13.7911 17.4451 15.7599 17.0815L8.7329 15.7945C8.21745 15.6991 7.94869 15.1382 8.20258 14.6825C8.84919 13.5329 10.398 11.72 13.7263 11.577C17.685 11.405 19.7515 13.7091 20.7881 15.6414C20.5308 13.6539 20.976 11.0823 24.0307 9.10803C27.5333 6.84658 30.4212 7.81134 31.7909 8.55613C32.251 8.80377 32.3066 9.42959 31.9186 9.77745L27.6486 13.5605C29.4827 12.8371 31.7466 12.5311 34.4695 13.2126C41.331 14.9288 42.9655 20.2515 43.3537 22.6708C43.4415 23.2306 42.8922 23.6891 42.3458 23.5115C39.4456 22.5708 31.5395 20.2443 25.3141 20.5201C27.654 31.1487 32.3661 37.3315 35.8989 40.6483C39.2953 40.3015 42.5941 40.5198 45.6728 41.1989C46.3589 39.0615 46.8426 36.0556 46.1663 32.3447C43.3301 32.9161 39.9697 35.3004 38.762 36.2202C38.5347 36.3918 38.2312 36.1932 38.2156 35.8562C38.1542 34.6068 38.405 32.0201 41.1607 30.2465C42.4844 29.3939 43.6772 29.2603 44.6538 29.4224L41.9275 27.914C41.6965 27.7849 41.6372 27.4173 41.8063 27.1957C42.2506 26.6077 43.2401 25.7867 44.9965 26.6113C46.4596 27.2957 47.0603 28.3405 47.2877 29.2264C47.4273 28.2155 47.9482 27.099 49.5081 26.7472C50.8892 26.438 51.8832 26.9476 52.4399 27.37C52.6865 27.5567 52.6667 28.004 52.4126 28.1474L49.1572 30.0091C50.1172 29.922 51.3269 30.1635 52.6972 31.2534Z" fill="#F0CC9E"/>
</g>
<defs>
<clipPath id="clip0_561_135">
<rect width="54" height="54" fill="white" transform="translate(0.72168 9.37695) rotate(-10)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

10
assets/svg/work.svg Executable file
View File

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="55" height="54" viewBox="0 0 55 54" fill="none">
<g clip-path="url(#clip0_561_71)">
<path d="M16.7655 46.5753C16.8038 46.6804 16.8823 46.766 16.9837 46.8133C17.0851 46.8606 17.2011 46.8657 17.3063 46.8274L27.6135 43.0759L29.0203 46.9411C29.2175 47.4827 29.8122 47.7647 30.355 47.5775L30.3721 47.5714C30.9195 47.3722 31.2017 46.767 31.0025 46.2196L29.5957 42.3544L43.8673 37.16L45.2741 41.0252C45.4712 41.5668 46.066 41.8489 46.6088 41.6616L46.6259 41.6556C47.1733 41.4563 47.4555 40.8511 47.2563 40.3038L45.8494 36.4385L56.1567 32.687C56.2597 32.6495 56.344 32.5734 56.3919 32.4748C56.4398 32.3762 56.4474 32.2629 56.4131 32.1587L56.4088 32.1463L60.2325 42.6517C61.2286 45.3885 59.8175 48.4147 57.0807 49.4108L27.3483 60.2325C24.6115 61.2286 21.5853 59.8175 20.5892 57.0807L16.7655 46.5753ZM33.5079 17.0239L24.5882 20.2704L25.995 24.1356L34.9147 20.8891L33.5079 17.0239ZM12.6533 35.2769C11.6572 32.5401 13.0683 29.514 15.8051 28.5179L22.7443 25.9922C22.7312 25.9596 22.7186 25.9267 22.7066 25.8937L20.939 21.0374C20.3414 19.3953 21.188 17.5797 22.8301 16.982L32.7409 13.3747C34.383 12.7771 36.1987 13.6237 36.7963 15.2658L38.5639 20.1221C38.576 20.1553 38.5874 20.1885 38.5983 20.2218L45.5375 17.6962C48.2743 16.7001 51.3005 18.1112 52.2966 20.8479L55.976 30.957C55.9377 30.8518 55.8592 30.7662 55.7578 30.7189C55.6564 30.6716 55.5404 30.6666 55.4352 30.7048L45.128 34.4564L43.7212 30.5912C43.524 30.0495 42.9293 29.7675 42.3864 29.9547L42.3693 29.9608C41.822 30.16 41.5398 30.7652 41.739 31.3126L43.1458 35.1778L28.8742 40.3723L27.4674 36.507C27.2703 35.9654 26.6755 35.6834 26.1327 35.8706L26.1156 35.8767C25.5682 36.0759 25.286 36.6811 25.4852 37.2285L26.8921 41.0937L16.5848 44.8452C16.4818 44.8827 16.3975 44.9588 16.3496 45.0574C16.3017 45.156 16.2941 45.2694 16.3284 45.3735L16.3327 45.386L12.6533 35.2769Z" fill="#D15151"/>
</g>
<defs>
<clipPath id="clip0_561_71">
<rect width="54" height="54" fill="white" transform="translate(0.393555 18.8629) rotate(-20)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -40,5 +40,30 @@ end
post_install do |installer| post_install do |installer|
installer.pods_project.targets.each do |target| installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(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
end end

View File

@ -161,7 +161,6 @@
C0627147FBB40A159A9ADF8D /* Pods-RunnerTests.release.xcconfig */, C0627147FBB40A159A9ADF8D /* Pods-RunnerTests.release.xcconfig */,
62D94669F4AF3486A044DD8D /* Pods-RunnerTests.profile.xcconfig */, 62D94669F4AF3486A044DD8D /* Pods-RunnerTests.profile.xcconfig */,
); );
name = Pods;
path = Pods; path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -199,6 +198,7 @@
9705A1C41CF9048500538489 /* Embed Frameworks */, 9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
95D511D35537B40B02EB61F2 /* [CP] Embed Pods Frameworks */, 95D511D35537B40B02EB61F2 /* [CP] Embed Pods Frameworks */,
3DDFD1B7D11C1E2D1782DB68 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
@ -330,6 +330,23 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
}; };
3DDFD1B7D11C1E2D1782DB68 /* [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;
};
95D511D35537B40B02EB61F2 /* [CP] Embed Pods Frameworks */ = { 95D511D35537B40B02EB61F2 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@ -470,17 +487,29 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = J8ZMG6U8PA;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.lux.translator.translatorLux; PRODUCT_BUNDLE_IDENTIFIER = com.translate.language.camera;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = translark_distribution;
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_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
}; };
name = Profile; name = Profile;
@ -496,9 +525,14 @@
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.lux.translator.translatorLux.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.lux.translator.translatorLux.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
}; };
name = Debug; name = Debug;
@ -514,7 +548,12 @@
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.lux.translator.translatorLux.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.lux.translator.translatorLux.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
}; };
name = Release; name = Release;
@ -530,7 +569,12 @@
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.lux.translator.translatorLux.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.lux.translator.translatorLux.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
}; };
name = Profile; name = Profile;
@ -539,7 +583,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
@ -596,7 +640,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
@ -652,18 +696,30 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = J8ZMG6U8PA;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.lux.translator.translatorLux; PRODUCT_BUNDLE_IDENTIFIER = com.translate.language.camera;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = translark_distribution;
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_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
}; };
name = Debug; name = Debug;
@ -674,17 +730,29 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = J8ZMG6U8PA;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.lux.translator.translatorLux; PRODUCT_BUNDLE_IDENTIFIER = com.translate.language.camera;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = translark_distribution;
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_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
}; };
name = Release; name = Release;

View File

@ -51,7 +51,7 @@
</Testables> </Testables>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug" buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

After

Width:  |  Height:  |  Size: 913 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 B

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 B

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -1,23 +1,23 @@
{ {
"images" : [ "images" : [
{ {
"filename" : "123.png",
"idiom" : "universal", "idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x" "scale" : "1x"
}, },
{ {
"filename" : "123 (2).png",
"idiom" : "universal", "idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"filename" : "123 (1).png",
"idiom" : "universal", "idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x" "scale" : "3x"
} }
], ],
"info" : { "info" : {
"version" : 1, "author" : "xcode",
"author" : "xcode" "version" : 1
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

View File

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
<!--View Controller--> <!--View Controller-->
@ -14,24 +16,28 @@
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/> <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides> </layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"> <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleAspectFill" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
</imageView> </imageView>
</subviews> </subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints> <constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/> <constraint firstItem="YRO-k0-Ey4" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="1pe-2f-GbL"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/> <constraint firstItem="YRO-k0-Ey4" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="IA6-g4-yre"/>
<constraint firstAttribute="bottom" secondItem="YRO-k0-Ey4" secondAttribute="bottom" id="lZS-y0-eCJ"/>
<constraint firstAttribute="trailing" secondItem="YRO-k0-Ey4" secondAttribute="trailing" id="phF-2k-cfC"/>
</constraints> </constraints>
</view> </view>
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="53" y="375"/> <point key="canvasLocation" x="80.916030534351137" y="264.08450704225356"/>
</scene> </scene>
</scenes> </scenes>
<resources> <resources>
<image name="LaunchImage" width="168" height="185"/> <image name="LaunchImage" width="250" height="541.33331298828125"/>
</resources> </resources>
</document> </document>

View File

@ -2,10 +2,12 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>Translator Lux</string> <string>TransLark</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
@ -13,7 +15,7 @@
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>translator_lux</string> <string>trans_lark</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
@ -24,6 +26,18 @@
<string>$(FLUTTER_BUILD_NUMBER)</string> <string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>NSCameraUsageDescription</key>
<string>This will enable you to take photos and recognize text within them for translation.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This will enable you to select photos from your library for text recognition and translation.</string>
<key>NSMicrophoneUsageDescription</key>
<string>This will enable you to input content through voice for recognition and translation.</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>This will enable you to use speech recognition to convert voice content to text for translation.</string>
<key>NSUserTrackingUsageDescription</key>
<string>This will help us provide a more personalized advertising experience. Your data privacy will be protected.</string>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UILaunchStoryboardName</key> <key>UILaunchStoryboardName</key>
<string>LaunchScreen</string> <string>LaunchScreen</string>
<key>UIMainStoryboardFile</key> <key>UIMainStoryboardFile</key>
@ -41,9 +55,5 @@
<string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict> </dict>
</plist> </plist>

View File

@ -1,5 +0,0 @@
import 'package:camera/camera.dart';
class AppConfig{
static List<CameraDescription> cameraList=[];
}

View File

@ -1,34 +1,84 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:translator_lux/page/main/main_view.dart'; import 'package:trans_lark/page/face_to_face/face_to_face_binding.dart';
import 'package:translator_lux/page/translator/translator_view.dart'; import 'package:trans_lark/page/face_to_face/face_to_face_view.dart';
import 'package:translator_lux/page/translator_result/translator_result_view.dart'; import 'package:trans_lark/page/home/home_view.dart';
import 'package:translator_lux/translator_history/translator_history_view.dart'; import 'package:trans_lark/page/scene_list/scene_list_binding.dart';
import 'package:trans_lark/page/scene_list/scene_list_view.dart';
import 'package:trans_lark/page/scene_type/scene_type_binding.dart';
import 'package:trans_lark/page/scene_type/scene_type_view.dart';
import 'package:trans_lark/page/splash/splash_binding.dart';
import 'package:trans_lark/page/splash/splash_view.dart';
import 'package:trans_lark/page/translator/translator_view.dart';
import 'package:trans_lark/page/translator_history/translator_history_view.dart';
import 'package:trans_lark/page/translator_result/translator_result_view.dart';
import 'package:trans_lark/page/web_page/web_page_binding.dart';
import 'package:trans_lark/page/web_page/web_page_view.dart';
class GetRouter { class GetRouter {
static String initRouterName = MainPage.routName; static const splash = '/';
static const home = '/home';
static const sceneType = '/scene_type';
static const sceneList = '/scene_list';
static const translate = '/translate';
static const faceToFace = '/face_to_face';
static const translateResult = '/translate_result';
static const translateHistory = '/translate_history';
static const terms = '/terms';
static const privacy = '/privacy';
static List<GetPage> routers = [ static List<GetPage> routers = [
// GetPage(
// name: splash,
// page: () => SplashView(),
// binding: SplashBinding(),
// ),
// //
GetPage( GetPage(
name: MainPage.routName, name: home,
page: () => MainPage(), page: () => HomePage(),
),
GetPage(
name: sceneType,
page: () => SceneTypeView(),
binding: SceneTypeBinding(),
),
GetPage(
name: sceneList,
page: () => SceneListView(),
binding: SceneListBinding(),
), ),
// //
GetPage( GetPage(
name: TranlatorPage.routName, name: translate,
page: () => const TranlatorPage(), page: () => const TranslatorPage(),
transition: Transition.rightToLeft,
), ),
// //
GetPage( GetPage(
name: TranslatorResultPage.routName, name: translateResult,
page: () => const TranslatorResultPage(), page: () => const TranslatorResultPage(),
transition: Transition.rightToLeft,
), ),
// //
GetPage( GetPage(
name: TranslatorHistoryPage.routName, name: translateHistory,
page: () => const TranslatorHistoryPage(), page: () => const TranslatorHistoryPage(),
transition: Transition.rightToLeft, ),
//
GetPage(
name: faceToFace,
page: () => FaceToFaceView(),
binding: FaceToFaceBinding(),
),
//
GetPage(
name: privacy,
page: () => WebPageView(),
binding: WebPageBinding(),
),
//
GetPage(
name: terms,
page: () => WebPageView(),
binding: WebPageBinding(),
), ),
]; ];
} }

View File

@ -1,143 +0,0 @@
import 'package:flutter/foundation.dart';
import 'package:sqflite/sqflite.dart';
import 'package:translator_lux/entity/translator_history_entity.dart';
class TranslatorHistoryTable {
static String tableName = "translatorHistoryTable";
static Database? thDB;
static createTable(Database db) async {
await db.execute(
"CREATE TABLE $tableName (tid TEXT,sourceText TEXT,sourcecountryCode TEXT,sourcelanguageName TEXT,sourcelanguageCode TEXT,targetText TEXT,targetcountryCode TEXT,targetlanguageName TEXT,targetlanguageCode TEXT,translatorTime TEXT,isShow Text)");
await db.execute(
'CREATE INDEX translator_history_tid ON $tableName (tid)',
);
debugPrint("TranslatorHistoryTable create success");
}
static init(Database db) {
thDB = db;
}
static insertData(TranslatorHistoryEntity historyEntity) {
thDB!.insert(tableName, {
"tid": historyEntity.tid,
"sourceText": historyEntity.sourceText,
"sourcecountryCode": historyEntity.sourcecountryCode,
"sourcelanguageName": historyEntity.sourcelanguageName,
"sourcelanguageCode": historyEntity.sourcelanguageCode,
"targetText": historyEntity.targetText,
"targetcountryCode": historyEntity.targetcountryCode,
"targetlanguageName": historyEntity.targetlanguageName,
"targetlanguageCode": historyEntity.targetlanguageCode,
"translatorTime": historyEntity.translatorTime,
"isShow": historyEntity.isShow,
});
}
static Future<List<TranslatorHistoryEntity>> queryData() async {
List<TranslatorHistoryEntity> responseData = [];
List<Map<String, Object?>> result = await thDB!.query(
tableName,
);
for (var historyData in result) {
responseData.add(
TranslatorHistoryEntity(
tid: historyData["tid"].toString(),
sourceText: historyData["sourceText"].toString(),
sourcecountryCode: historyData["sourcecountryCode"].toString(),
sourcelanguageName: historyData["sourcelanguageName"].toString(),
sourcelanguageCode: historyData["sourcelanguageCode"].toString(),
targetText: historyData["targetText"].toString(),
targetcountryCode: historyData["targetcountryCode"].toString(),
targetlanguageName: historyData["targetlanguageName"].toString(),
targetlanguageCode: historyData["targetlanguageCode"].toString(),
translatorTime: historyData["translatorTime"].toString(),
isShow: historyData["isShow"].toString(),
),
);
}
return responseData;
}
static Future<List<TranslatorHistoryEntity>> queryShowData() async {
List<TranslatorHistoryEntity> responseData = [];
List<Map<String, Object?>> result = await thDB!.query(
tableName,
where: "isShow = ? ",
whereArgs: ["true"],
);
for (var historyData in result) {
responseData.add(
TranslatorHistoryEntity(
tid: historyData["tid"].toString(),
sourceText: historyData["sourceText"].toString(),
sourcecountryCode: historyData["sourcecountryCode"].toString(),
sourcelanguageName: historyData["sourcelanguageName"].toString(),
sourcelanguageCode: historyData["sourcelanguageCode"].toString(),
targetText: historyData["targetText"].toString(),
targetcountryCode: historyData["targetcountryCode"].toString(),
targetlanguageName: historyData["targetlanguageName"].toString(),
targetlanguageCode: historyData["targetlanguageCode"].toString(),
translatorTime: historyData["translatorTime"].toString(),
isShow: historyData["isShow"].toString(),
),
);
}
return responseData;
}
static Future<TranslatorHistoryEntity> queryShowDataByTid(String tid) async {
TranslatorHistoryEntity responseData = TranslatorHistoryEntity();
List<Map<String, Object?>> result = await thDB!.query(
tableName,
where: "tid = ? ",
whereArgs: [tid],
);
var historyData = result.first;
responseData.copyWith(
tid: historyData["tid"].toString(),
sourceText: historyData["sourceText"].toString(),
sourcecountryCode: historyData["sourcecountryCode"].toString(),
sourcelanguageName: historyData["sourcelanguageName"].toString(),
sourcelanguageCode: historyData["sourcelanguageCode"].toString(),
targetText: historyData["targetText"].toString(),
targetcountryCode: historyData["targetcountryCode"].toString(),
targetlanguageName: historyData["targetlanguageName"].toString(),
targetlanguageCode: historyData["targetlanguageCode"].toString(),
translatorTime: historyData["translatorTime"].toString(),
isShow: historyData["isShow"].toString(),
);
return responseData;
}
static cleanAllShowData() async {
await thDB!.update(
tableName,
{
"isShow": "false",
},
where: " isShow = ? ",
whereArgs: ["true"],
);
}
static cleanShowDataByTid(String tid) async {
await thDB!.update(
tableName,
{
"isShow": "false",
},
where: " tid = ? ",
whereArgs: [tid],
);
}
static deleteHistoryDataByTid(String tid) async {
await thDB!.delete(
tableName,
where: " tid = ? ",
whereArgs: [tid],
);
}
}

View File

@ -1,28 +0,0 @@
import 'package:flutter/foundation.dart';
import 'package:sqflite/sqflite.dart';
import 'package:translator_lux/dataBase/table/translator_history_table.dart';
class TranslatorDataBase {
static Database? thDB;
static String dataBaseName = "translator.db";
static init() async {
String path = await getDatabasesPath();
path = "$path/$dataBaseName";
debugPrint(path);
await openDatabase(
path,
version: 1,
onCreate: (db, version) async {
debugPrint("dataBase create success");
await TranslatorHistoryTable.createTable(db);
debugPrint("dataTable create success");
},
).then(
(value) {
thDB = value;
TranslatorHistoryTable.init(value);
},
);
}
}

View File

@ -0,0 +1,86 @@
// Author: fengshengxiong
// Date: 2024/6/4
// Description:
import 'dart:convert';
import 'package:hive/hive.dart';
part 'history_model.g.dart';
@HiveType(typeId: 1)
class HistoryEntity 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;
HistoryEntity({
this.translationTime,
this.sourceText,
this.targetText,
this.sourceLanguageName,
this.sourceLanguageCode,
this.targetLanguageName,
this.targetLanguageCode,
});
HistoryEntity fromJson(String str) => HistoryEntity.fromMap(json.decode(str));
String toJson() => json.encode(toMap());
HistoryEntity copyWith({
int? translationTime,
String? sourceText,
String? targetText,
String? sourceLanguageName,
String? sourceLanguageCode,
String? targetLanguageName,
String? targetLanguageCode,
}) =>
HistoryEntity(
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 HistoryEntity.fromMap(Map<String, dynamic> json) => HistoryEntity(
translationTime: json["translationTime"],
sourceText: json["sourceText"],
targetText: json["targetText"],
sourceLanguageName: json["sourceLanguageName"],
sourceLanguageCode: json["sourceLanguageCode"],
targetLanguageName: json["targetLanguageName"],
targetLanguageCode: json["targetLanguageCode"],
);
Map<String, dynamic> toMap() => {
"translationTime": translationTime,
"sourceText": sourceText,
"targetText": targetText,
"sourceLanguageName": sourceLanguageName,
"sourceLanguageCode": sourceLanguageCode,
"targetLanguageName": targetLanguageName,
"targetLanguageCode": targetLanguageCode,
};
}

View File

@ -0,0 +1,59 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'history_model.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class HistoryEntityAdapter extends TypeAdapter<HistoryEntity> {
@override
final int typeId = 1;
@override
HistoryEntity read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return HistoryEntity(
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, HistoryEntity 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;
}

View File

@ -1,14 +1,31 @@
class SelectLanguageItemEntity { import 'dart:convert';
String countryCode;
String languageName; class LanguageEntity {
String languageCode; String languageCode;
SelectLanguageItemEntity({ String languageName;
required this.countryCode,
required this.languageName, LanguageEntity({
required this.languageCode, required this.languageCode,
required this.languageName,
}); });
@override LanguageEntity copyWith() => LanguageEntity(
String toString() => languageCode: languageCode,
'SelectLanguageItemEntity(countryCode: $countryCode, languageName: $languageName, languageCode: $languageCode)'; languageName: languageName,
);
factory LanguageEntity.fromJson(String str) =>
LanguageEntity.fromMap(json.decode(str));
String toJson() => json.encode(toMap());
factory LanguageEntity.fromMap(Map<String, dynamic> json) => LanguageEntity(
languageCode: json["languageCode"],
languageName: json["languageName"],
);
Map<String, dynamic> toMap() => {
"languageCode": languageCode,
"languageName": languageName,
};
} }

View File

@ -0,0 +1,149 @@
// Author: fengshengxiong
// Date: 2024/7/8
// Description:
import 'dart:convert';
class SceneEntity {
String? sceneType;
List<SceneList>? sceneList;
SceneEntity({
this.sceneType,
this.sceneList,
});
SceneEntity copyWith({
String? sceneType,
List<SceneList>? sceneList,
}) =>
SceneEntity(
sceneType: sceneType ?? this.sceneType,
sceneList: sceneList ?? this.sceneList,
);
factory SceneEntity.fromJson(String str) => SceneEntity.fromMap(json.decode(str));
String toJson() => json.encode(toMap());
factory SceneEntity.fromMap(Map<String, dynamic> json) => SceneEntity(
sceneType: json["sceneType"],
sceneList: json["sceneList"] == null ? [] : List<SceneList>.from(json["sceneList"]!.map((x) => SceneList.fromMap(x))),
);
Map<String, dynamic> toMap() => {
"sceneType": sceneType,
"sceneList": sceneList == null ? [] : List<dynamic>.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,
});
SceneList copyWith({
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(
english: english ?? this.english,
sceneType: sceneType ?? this.sceneType,
chineseSimplified: chineseSimplified ?? this.chineseSimplified,
spanish: spanish ?? this.spanish,
hindi: hindi ?? this.hindi,
arabic: arabic ?? this.arabic,
portuguese: portuguese ?? this.portuguese,
bengali: bengali ?? this.bengali,
russian: russian ?? this.russian,
punjabi: punjabi ?? this.punjabi,
javanese: javanese ?? this.javanese,
korean: korean ?? this.korean,
french: french ?? this.french,
german: german ?? this.german,
japanese: japanese ?? this.japanese,
);
factory SceneList.fromJson(String str) => SceneList.fromMap(json.decode(str));
String toJson() => json.encode(toMap());
factory SceneList.fromMap(Map<String, dynamic> 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<String, dynamic> 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,
};
}

43
lib/generated/assets.dart Normal file
View File

@ -0,0 +1,43 @@
///This file is automatically generated. DO NOT EDIT, all your changes would be lost.
class Assets {
Assets._();
static const String imagesAppbarBack = 'assets/images/appbar_back.png';
static const String imagesCopy = 'assets/images/copy.png';
static const String imagesDeleteIcon = 'assets/images/delete_icon.png';
static const String imagesDialog = 'assets/images/dialog.png';
static const String imagesFullScreen = 'assets/images/fullScreen.png';
static const String imagesHistory = 'assets/images/history.png';
static const String imagesHomeBackground = 'assets/images/homeBackground.png';
static const String imagesHomeMore = 'assets/images/homeMore.png';
static const String imagesPhoto = 'assets/images/photo.png';
static const String imagesPoyline = 'assets/images/poyline.png';
static const String imagesRabbitSayGood = 'assets/images/rabbitSayGood.png';
static const String imagesSpeakFace = 'assets/images/speak_face.png';
static const String imagesStar = 'assets/images/star.png';
static const String imagesSwitchHomeIcon = 'assets/images/switch_home_icon.png';
static const String imagesToHomeBottom = 'assets/images/to_home_bottom.png';
static const String imagesTranslatorResultBackground = 'assets/images/translatorResultBackground.png';
static const String jsonLanguage = 'assets/json/language.json';
static const String jsonTranslationScene = 'assets/json/translation_scene.json';
static const String launcherIconLauncherIcon = 'assets/launcher_icon/launcher_icon.png';
static const String svgDailyGreetings = 'assets/svg/daily_greetings.svg';
static const String svgDinning = 'assets/svg/dinning.svg';
static const String svgEars = 'assets/svg/ears.svg';
static const String svgFaceVoice = 'assets/svg/face_voice.svg';
static const String svgFamily = 'assets/svg/family.svg';
static const String svgHealthy = 'assets/svg/healthy.svg';
static const String svgHomeMore = 'assets/svg/homeMore.svg';
static const String svgHomeRightIcon = 'assets/svg/home_right_icon.svg';
static const String svgHomeVoice = 'assets/svg/homeVoice.svg';
static const String svgMakeFriends = 'assets/svg/make_friends.svg';
static const String svgRotate = 'assets/svg/rotate.svg';
static const String svgShopping = 'assets/svg/shopping.svg';
static const String svgSpeaker = 'assets/svg/speaker.svg';
static const String svgSpeakerWhite = 'assets/svg/speaker_white.svg';
static const String svgStudy = 'assets/svg/study.svg';
static const String svgTransportation = 'assets/svg/transportation.svg';
static const String svgTravel = 'assets/svg/travel.svg';
static const String svgWork = 'assets/svg/work.svg';
}

View File

@ -0,0 +1,9 @@
// Author: fengshengxiong
// Date: 2024/6/13
// Description: App配置
class AppConfig {
/// App名称
static const appName = 'TransLark';
}

View File

@ -1,16 +0,0 @@
import 'package:flutter_tts/flutter_tts.dart';
import 'package:get/get.dart';
import 'package:translator_lux/enum/tts_enum.dart';
class GlobalState {
static RxString fromCountryName = "English".obs;
static RxString fromCountryCode = "us".obs;
static RxString fromLanguageCode = "en".obs;
static RxString toCountryName = "Chinese".obs;
static RxString toCountryCode = "cn".obs;
static RxString toLanguageCode = "zh-cn".obs;
static FlutterTts ttsController = FlutterTts();
static TtsEnum ttsEnum = TtsEnum.stopped;
}

View File

@ -0,0 +1,85 @@
// Author: fengshengxiong
// Date: 2024/5/8
// Description:
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:speech_to_text/speech_recognition_error.dart';
import 'package:speech_to_text/speech_to_text.dart';
import 'package:trans_lark/widget/base_easyloading.dart';
class SpeechToTextManager {
static final SpeechToTextManager _instance = SpeechToTextManager._();
factory SpeechToTextManager() {
return _instance;
}
SpeechToTextManager._();
final _speechToText = SpeechToText();
var hasSpeech = false;
var isListening = false.obs;
Future<void> initSpeech() async {
try {
BaseEasyLoading.loading();
hasSpeech = await _speechToText.initialize(
onStatus: _statusListener,
onError: _errorListener,
);
BaseEasyLoading.dismiss();
_speechToText.statusListener ??= _statusListener;
_speechToText.errorListener ??= _errorListener;
} catch (e) {
debugPrint('Speech recognition failed: ${e.toString()}');
}
}
void _statusListener(String status) {
debugPrint('状态:$status');
if (status == 'listening') {
isListening.value = true;
} else {
isListening.value = false;
}
}
void _errorListener(SpeechRecognitionError error) {
debugPrint('Received error status: $error, listening: ${_speechToText.isListening}');
BaseEasyLoading.toast('Speech recognition failed: ${error.errorMsg}');
}
Future<void> startListening(String localeId, SpeechResultListener onResult) async {
BaseEasyLoading.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,
),
);
BaseEasyLoading.dismiss();
} catch (e) {
if (e.runtimeType == ListenFailedException) {
debugPrint('speechToText.listen${(e as ListenFailedException).message}');
} else {
debugPrint('speechToText.listen${e.toString()}');
}
BaseEasyLoading.toast('The current language does not support speech recognition');
}
}
Future<void> stopListening() async {
if (isListening.value) {
BaseEasyLoading.loading();
await _speechToText.stop();
BaseEasyLoading.dismiss();
}
}
}

View File

@ -0,0 +1,68 @@
// Author: fengshengxiong
// Date: 2024/5/8
// Description:
import 'dart:convert';
import 'dart:ui';
import 'package:devicelocale/devicelocale.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:trans_lark/entity/language_entity.dart';
import 'package:trans_lark/generated/assets.dart';
import 'package:trans_lark/util/num_util.dart';
class TranslateLanguage {
TranslateLanguage._();
static final TranslateLanguage _instance = TranslateLanguage._();
factory TranslateLanguage() {
return _instance;
}
///
var languageList = <LanguageEntity>[].obs;
///
var fromLanguageEntity = LanguageEntity(
languageCode: 'en',
languageName: 'English',
).obs;
///
var toLanguageEntity = LanguageEntity(
languageCode: 'zh-cn',
languageName: 'Chinese (Simplified)',
).obs;
///
var isSelectFromLanguage = true.obs;
Future<void> init() async {
var data = jsonDecode(await rootBundle.loadString(Assets.jsonLanguage));
if (data != null && data is List) {
languageList.value = data.map((e) => LanguageEntity.fromMap(e)).toList();
}
List<Locale> languages = await Devicelocale.preferredLanguagesAsLocales;
if (languages.isNotEmpty) {
var languageEntity = languageList.firstWhereOrNull((e) => e.languageCode.contains(languages[0].languageCode));
if (languageEntity != null) {
toLanguageEntity.value = languageEntity.copyWith();
}
if (toLanguageEntity.value.languageCode == fromLanguageEntity.value.languageCode) {
var index = 0;
for (var i = 0; i < languageList.length; ++i) {
var o = languages[i];
if (o.languageCode == toLanguageEntity.value.languageCode) {
index = i;
break;
}
}
var num = NumUtil.getRandomNumberExcludingCurrent(0, languageList.length, index);
fromLanguageEntity.value = languageList[num].copyWith();
}
}
}
}

43
lib/global/tts_manager.dart Executable file
View File

@ -0,0 +1,43 @@
import 'package:flutter/foundation.dart';
import 'package:flutter_tts/flutter_tts.dart';
import 'package:trans_lark/widget/base_easyloading.dart';
class TtsManager {
TtsManager._();
static final TtsManager _instance = TtsManager._();
factory TtsManager() {
return _instance;
}
late FlutterTts ttsController;
Future<void> initTts() async {
debugPrint("TTS Service init start");
ttsController = FlutterTts();
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);
debugPrint("TTS Service init success");
}
Future<void> translatorTtsPlay(String text, String language) async {
try {
await ttsController.stop();
await ttsController.setLanguage(language);
await ttsController.speak(text);
} catch (e) {
BaseEasyLoading.toast('This language cannot be played');
return;
}
}
}

View File

@ -1,38 +1,66 @@
import 'package:camera/camera.dart'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:translator_lux/config/config.dart'; import 'package:trans_lark/core/router/router.dart';
import 'package:translator_lux/core/router/router.dart'; import 'package:trans_lark/global/app_config.dart';
import 'package:translator_lux/dataBase/translator_data_base.dart'; import 'package:trans_lark/global/translate_language.dart';
import 'package:translator_lux/util/tts_util.dart'; import 'package:trans_lark/global/tts_manager.dart';
import 'package:trans_lark/storage/hive_storage.dart';
import 'package:trans_lark/widget/base_easyloading.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
AppConfig.cameraList = await availableCameras();
// Hive
await initHive();
//
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
//
if (Platform.isAndroid) {
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
));
}
await TranslateLanguage().init();
await TtsManager().initTts();
runApp(const MyApp()); runApp(const MyApp());
} }
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
const MyApp({super.key}); const MyApp({super.key});
// This widget is the root of your application.
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GetMaterialApp( final easyLoading = EasyLoading.init();
return KeyboardDismissOnTap(
child: GetMaterialApp(
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
title: 'TranslatorLux', title: AppConfig.appName,
theme: ThemeData( theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), colorScheme: ColorScheme.fromSeed(seedColor: const Color.fromARGB(255, 185, 239, 200)),
useMaterial3: true, useMaterial3: true,
), ),
initialBinding: BindingsBuilder(() async { initialRoute: GetRouter.home,
debugPrint("init start");
await TtsUtil.initTts();
await TranslatorDataBase.init();
debugPrint("init success");
}),
initialRoute: GetRouter.initRouterName,
getPages: GetRouter.routers, getPages: GetRouter.routers,
defaultTransition: Transition.rightToLeft,
builder: (context, widget) {
BaseEasyLoading.configLoading();
widget = easyLoading(context, widget);
//
return MediaQuery.withNoTextScaling(child: widget);
},
),
); );
} }
} }

View File

@ -0,0 +1,10 @@
import 'package:get/get.dart';
import 'face_to_face_controller.dart';
class FaceToFaceBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => FaceToFaceController());
}
}

View File

@ -0,0 +1,130 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:speech_to_text/speech_recognition_result.dart';
import 'package:translator/translator.dart';
import 'package:trans_lark/global/speech_to_text_manager.dart';
import 'package:trans_lark/global/translate_language.dart';
import 'package:trans_lark/util/obj_util.dart';
import 'package:trans_lark/widget/base_easyloading.dart';
class FaceToFaceController extends GetxController with GetSingleTickerProviderStateMixin{
final aboveScrollController = ScrollController();
final underScrollController = ScrollController();
var angle = 0.0.obs;
///
final _translator = GoogleTranslator();
///
var aboveText = ''.obs;
var underText = ''.obs;
///
var selectedUnder = true.obs;
@override
void onReady() async {
super.onReady();
onTapSpeak(true);
}
@override
void onClose() async {
await SpeechToTextManager().stopListening();
aboveScrollController.dispose();
underScrollController.dispose();
super.onClose();
}
Future<void> onBackTap() async {
await SpeechToTextManager().stopListening();
Get.back();
}
/// 180
void onTapRotate() {
angle.value -= 0.5;
}
Future<void> onTapSpeak(bool isUnder) async {
if (!SpeechToTextManager().hasSpeech) {
await SpeechToTextManager().initSpeech();
}
if (SpeechToTextManager().hasSpeech) {
if (isUnder) {
if (!selectedUnder.value) {
await SpeechToTextManager().stopListening();
}
selectedUnder.value = true;
_scrollToBottom();
SpeechToTextManager().startListening(TranslateLanguage().fromLanguageEntity.value.languageCode, _onSpeechResult);
} else {
if (selectedUnder.value) {
await SpeechToTextManager().stopListening();
}
selectedUnder.value = false;
_scrollToBottom();
SpeechToTextManager().startListening(TranslateLanguage().toLanguageEntity.value.languageCode, _onSpeechResult);
}
} else {
BaseEasyLoading.toast('Speech not available');
}
}
Future<void> _onSpeechResult(SpeechRecognitionResult result) async {
debugPrint('识别结果:${result.recognizedWords}');
if (ObjUtil.isNotEmptyStr(result.recognizedWords)) {
if (selectedUnder.value) {
underText.value += '${result.recognizedWords}\n';
var translateText = await _translation(result.recognizedWords);
debugPrint('翻译结果:${result.recognizedWords}');
if (ObjUtil.isNotEmptyStr(translateText)) {
aboveText.value += '$translateText\n';
}
} else {
aboveText.value += '${result.recognizedWords}\n';
var translateText = await _translation(result.recognizedWords);
debugPrint('翻译结果:${result.recognizedWords}');
if (ObjUtil.isNotEmptyStr(translateText)) {
underText.value += '$translateText\n';
}
}
_scrollToBottom();
}
}
Future<String> _translation(String sourceText) async {
try {
String from = selectedUnder.value ? TranslateLanguage().fromLanguageEntity.value.languageCode : TranslateLanguage().toLanguageEntity.value.languageCode;
String to = selectedUnder.value ? TranslateLanguage().toLanguageEntity.value.languageCode : TranslateLanguage().fromLanguageEntity.value.languageCode;
Translation translate = await _translator.translate(
sourceText,
from: from,
to: to,
);
return translate.text;
} catch (e) {
debugPrint('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,
);
}
}
}

Some files were not shown because too many files have changed in this diff Show More